问题背景
给你一个下标从 0 0 0 开始的整数数组 n u m s nums nums。如果 i < j i < j i<j 且 j − i ≠ n u m s [ j ] − n u m s [ i ] j - i \ne nums[j] - nums[i] j−i=nums[j]−nums[i],那么我们称 ( i , j ) (i, j) (i,j) 是一个 坏数对 。
请你返回 n u m s nums nums 中 坏数对 的总数目。
数据约束
- 1 ≤ n u m s . l e n g t h ≤ 1 0 5 1 \le nums.length \le 10 ^ 5 1≤nums.length≤105
- 1 ≤ n u m s [ i ] ≤ 1 0 9 1 \le nums[i] \le 10 ^ 9 1≤nums[i]≤109
解题过程
j − i ≠ n u m s [ j ] − n u m s [ i ] j - i \ne nums[j] - nums[i] j−i=nums[j]−nums[i] 可以变形为 n u m s [ i ] − i ≠ n u m s [ j ] − j nums[i] − i \ne nums[j] − j nums[i]−i=nums[j]−j,这在形式上就和 好数对的数目 很像了,可以用类似的方式解决。
具体实现
class Solution {public long countBadPairs(int[] nums) {int n = nums.length;long res = 0;Map<Integer, Integer> count = new HashMap<>();for (int i = 0; i < n; i++) {int cur = nums[i] - i;int num = count.getOrDefault(cur, 0);res += num;count.put(cur, num + 1);}return (long) n * (n - 1) / 2 - res;}
}