classSolution: defcountKDifference(self, nums: List[int], k: int) -> int: res, n = 0, len(nums) for i inrange(n): for j inrange(i + 1, n): ifabs(nums[i] - nums[j]) == k: res += 1 return res
[sol1-Java]
1 2 3 4 5 6 7 8 9 10 11 12 13
classSolution { publicintcountKDifference(int[] nums, int k) { intres=0, n = nums.length; for (inti=0; i < n; ++i) { for (intj= i + 1; j < n; ++j) { if (Math.abs(nums[i] - nums[j]) == k) { ++res; } } } return res; } }
[sol1-C#]
1 2 3 4 5 6 7 8 9 10 11 12 13
publicclassSolution { publicintCountKDifference(int[] nums, int k) { int res = 0, n = nums.Length; for (int i = 0; i < n; ++i) { for (int j = i + 1; j < n; ++j) { if (Math.Abs(nums[i] - nums[j]) == k) { ++res; } } } return res; } }
[sol1-C++]
1 2 3 4 5 6 7 8 9 10 11 12 13 14
classSolution { public: intcountKDifference(vector<int>& nums, int k){ int res = 0, n = nums.size(); for (int i = 0; i < n; ++i) { for (int j = i + 1; j < n; ++j) { if (abs(nums[i] - nums[j]) == k) { ++res; } } } return res; } };
[sol1-C]
1 2 3 4 5 6 7 8 9 10 11
intcountKDifference(int* nums, int numsSize, int k){ int res = 0; for (int i = 0; i < numsSize; ++i) { for (int j = i + 1; j < numsSize; ++j) { if (abs(nums[i] - nums[j]) == k) { ++res; } } } return res; }
[sol1-Golang]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
funccountKDifference(nums []int, k int) (ans int) { for j, x := range nums { for _, y := range nums[:j] { if abs(x-y) == k { ans++ } } } return }
funcabs(x int)int { if x < 0 { return -x } return x }
[sol1-JavaScript]
1 2 3 4 5 6 7 8 9 10 11
var countKDifference = function(nums, k) { let res = 0, n = nums.length; for (let i = 0; i < n; ++i) { for (let j = i + 1; j < n; ++j) { if (Math.abs(nums[i] - nums[j]) == k) { ++res; } } } return res; };
复杂度分析
时间复杂度:O(n^2),其中 n 为数组 nums 的长度。我们使用了两层循环来寻找所有符合条件的数对。
空间复杂度:O(1)。我们仅使用常数空间。
方法二:哈希表 + 一次遍历
思路
我们进行一次遍历,遍历时下标代表 j。对每一个 j,我们需要知道在这个 j 之前的符合条件的 i 的个数,即满足 |\texttt{nums}[i] - \texttt{nums}[j]| = k 的 i 的个数,亦即满足 nums}[i] = \texttt{nums}[j] + k 或 nums}[i] = \texttt{nums}[j] - k 的 i 的个数。使用哈希表可以在 O(1) 的时间内统计出这样的个数,因此在遍历时我们可以使用一个哈希表来维护不同数值的频率,并统计符合条件的数对总数。
代码
[sol2-Python3]
1 2 3 4 5 6 7 8
classSolution: defcountKDifference(self, nums: List[int], k: int) -> int: res = 0 cnt = Counter() for num in nums: res += cnt[num - k] + cnt[num + k] cnt[num] += 1 return res