当前位置: 首页 > java >正文

LeetCode每日一题4.18

2364.统计坏数对的数目

问题

在这里插入图片描述

问题分析

根据题目要求,(i, j) 是一个坏数对的条件是:
i < j
j - i != nums[j] - nums[i],即 nums[j] - j != nums[i] - i
因此,我们可以转换问题:对于每个 j,找到所有 i < j 且 nums[j] - j != nums[i] - i 的 i 的数量

思考

首先考了简单枚举:

class Solution:def countBadPairs(self, nums: List[int]) -> int:ans = 0for i in range(len(nums) - 1):for j in range(i + 1, len(nums)):if j - i != nums[j] - nums[i]:ans += 1return ans

字符串长的情况在这里插入图片描述
数据量大会导致超时

其他解法

计算 nums[i] - i 的值

首先,我们计算每个位置 i 上 nums[i] - i 的值,并存储这些值。

使用哈希表维护

使用一个哈希表来维护到当前 j 位置为止,所有 nums[i] - i (i < j)的出现次数。
遍历数组:对于每个 j,计算 nums[j] - j。
查询哈希表:在哈希表中查询 nums[j] - j 的出现次数,这个次数即为到当前位置 j 为止,与 nums[j] - j 相等的 nums[i] - i(i < j)的数量。
更新结果:坏数对的数量为 j(当前索引)减去上述查询得到的次数(即不相等的数量)。
更新哈希表:将 nums[j] - j 的出现次数加 1。

代码

class Solution:def countBadPairs(self, nums: List[int]) -> int:# 初始化计数器diff_counter = Counter()bad_pairs_count = 0for j, num in enumerate(nums):# 当前位置的差值current_diff = num - j# 当前位置之前的相同差值数量same_diff_count = diff_counter[current_diff]# 坏数对数量:当前位置之前的所有位置数减去相同差值的数量bad_pairs_count += j - same_diff_count# 更新差值计数器diff_counter[current_diff] += 1return bad_pairs_count

复杂度分析

时间复杂度:O(n),其中 n 是 nums 的长度。我们只进行了一次遍历,并且每次操作(查询和更新哈希表)的平均时间复杂度为 O(1)。
空间复杂度:O(n),最坏情况下,哈希表中需要存储 n 个不同的差值

学习

在这里插入图片描述

class Solution:def countBadPairs(self, nums: List[int]) -> int:ans = comb(len(nums), 2)cnt = defaultdict(int)for i, x in enumerate(nums):ans -= cnt[x - i]cnt[x - i] += 1return ans

时间复杂度:O(n),其中 n 是 nums 的长度。
空间复杂度:O(n)。

学习来源

:灵茶山艾府

http://www.xdnf.cn/news/270.html

相关文章:

  • 海关总署广东:广东外贸一季度进出口2.14万亿元 同期增长4.2%
  • 斐波那契数列计算:数据结构与算法视角
  • C++(17):通过filesystem获取文件的大小
  • Promise的详细讲解
  • python豆包语音合成并播放
  • 如何用 esProc 将数据库表转储提速查询
  • 视频编解码种类/技术/区别/优缺点汇总
  • osgb和obj格式互转
  • 代码学习总结(四)
  • LabVIEW技巧——获取文件版本信息
  • 【Python】使用Flet开发批量解密Excel工具
  • 遥感技术赋能电力设施监控:应用案例篇
  • 2024年RIS SCI2区:自适应天鹰算法AAO,深度解析+性能实测
  • Docker 容器与镜像核心操作命令大全(实战指南)
  • Andorid 使用 libphonenumber-android 获取国际电话区号
  • 线上健身预约小程序源码介绍
  • CSS 包含块
  • 动手学深度学习:手语视频在NiN模型中的测试
  • C++——C++11常用语法总结
  • 嵌入式面试常见算法题解析:数组元素移动与二分查找
  • 在 Vue 3 项目中引入 js-cookie 库
  • 打造一个 AI 面试助手:输入岗位 + 技术栈 → 自动生成面试问题 + 标准答案 + 技术考点图谱
  • 2025年03月中国电子学会青少年软件编程(Python)等级考试试卷(五级)真题
  • vue3学习笔记之属性绑定
  • 适合制作电磁铁的材料及特性
  • STL简介 + string【上】
  • 图像篡改检测算法
  • 【MATLAB代码例程】AOA与TOA结合的高精度平面地位,适用于四个基站的情况,附完整的代码
  • 万字解析TCP
  • 一次制作参考网杂志的阅读书源的实操经验总结(附书源)