侧边栏壁纸
博主头像
GabrielxD

列車は必ず次の駅へ。では舞台は?私たちは?

  • 累计撰写 675 篇文章
  • 累计创建 128 个标签
  • 累计收到 26 条评论

目 录CONTENT

文章目录

【数学, 哈希表, 计数】统计坏数对的数目

GabrielxD
2022-08-09 / 0 评论 / 0 点赞 / 292 阅读 / 490 字
温馨提示:
本文最后更新于 2022-09-02,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

题目

2364. 统计坏数对的数目


给你一个下标从 0 开始的整数数组 nums 。如果 i < j 且 j - i != nums[j] - nums[i] ,那么我们称 (i, j) 是一个 坏****数对 。

请你返回 nums 中 坏数对 的总数目。

示例 1:

输入:nums = [4,1,3,3]
输出:5
解释:数对 (0, 1) 是坏数对,因为 1 - 0 != 1 - 4 。
数对 (0, 2) 是坏数对,因为 2 - 0 != 3 - 4, 2 != -1 。
数对 (0, 3) 是坏数对,因为 3 - 0 != 3 - 4, 3 != -1 。
数对 (1, 2) 是坏数对,因为 2 - 1 != 3 - 1, 1 != 2 。
数对 (2, 3) 是坏数对,因为 3 - 2 != 3 - 3, 1 != 0 。
总共有 5 个坏数对,所以我们返回 5 。

示例 2:

输入:nums = [1,2,3,4,5]
输出:0
解释:没有坏数对。

提示:

  • 1 <= nums.length <= 10^5
  • 1 <= nums[i] <= 10^9

解题

方法一:哈希表 数学 计数

思路

j - i != nums[j] - nums[i] 变形为 j - nums[j] != i - nums[i]

于是就可以求出 j - nums[j] == i - nums[i] 的对数拿总对数减去后就是坏数对的数目。

求对数参考 【数学, 哈希表, 计数】统计一个数组中好对子的数目,条件变成了求 count(i - nums[i]) 的组合数。

总对数为 n(n1)2\frac{n(n-1)}{2} (n` 是数组元素个数),参见 【数学, 哈希表, 计数】好数对的数目

代码

class Solution {
public:
    long long countBadPairs(vector<int>& nums) {
        long long n = nums.size(), ans = n * (n - 1) / 2;;
        unordered_map<int, long long> counts;
        for (int i = 0; i < n; ++i) ans -= counts[i - nums[i]]++;
        return ans;
    }
};
class Solution {
    public long countBadPairs(int[] nums) {
        long n = nums.length, ans = n * (n - 1) / 2;
        Map<Integer, Long> map = new HashMap<>();
        for (int i = 0; i < n; ++i) {
            int tmp = i - nums[i];
            long count = map.getOrDefault(tmp, 0L);
            ans -= count;
            map.put(tmp, count + 1);
        }
        return ans;
    }
}
0

评论区