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)。
学习来源
:灵茶山艾府