Skip to content

Commit aa1e80b

Browse files
committed
feat: add solutions to lc problem: No.2006
No.2006.Count Number of Pairs With Absolute Difference K
1 parent 5234f26 commit aa1e80b

File tree

7 files changed

+121
-108
lines changed

7 files changed

+121
-108
lines changed

solution/2000-2099/2002.Maximum Product of the Length of Two Palindromic Subsequences/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@
5757

5858
我们注意到,字符串 $s$ 的长度不超过 $12$,因此我们可以使用二进制枚举的方法来枚举 $s$ 的所有子序列。不妨设 $s$ 的长度为 $n$,我们可以使用 $2^n$ 个长度为 $n$ 的二进制数来表示 $s$ 的所有子序列。对于每个二进制数,第 $i$ 位为 $1$ 表示 $s$ 的第 $i$ 个字符在子序列中,为 $0$ 表示不在子序列中。我们对于每个二进制数,判断其是否为回文子序列,并且记录在数组 $p$ 中。
5959

60-
接下来,我们枚举 $p$ 中的每个数 $i$,如果 $i$ 是回文子序列,那么我们可以从 $i$ 的补集 $mx = (2^n - 1) \& \overline{i}$ 中枚举一个数 $j$,如果 $j$ 也是回文子序列,那么 $i$ 和 $j$ 就是我们要找的两个回文子序列,它们的长度分别为 $i$ 和 $j$ 的二进制表示中的 $1$ 的个数,我们记为 $a$ 和 $b$,那么它们的乘积就是 $a \times b$,我们取所有可能的 $a \times b$ 中的最大值即可。
60+
接下来,我们枚举 $p$ 中的每个数 $i$,如果 $i$ 是回文子序列,那么我们可以从 $i$ 的补集 $mx = (2^n - 1) \oplus i$ 中枚举一个数 $j$,如果 $j$ 也是回文子序列,那么 $i$ 和 $j$ 就是我们要找的两个回文子序列,它们的长度分别为 $i$ 和 $j$ 的二进制表示中的 $1$ 的个数,我们记为 $a$ 和 $b$,那么它们的乘积就是 $a \times b$,我们取所有可能的 $a \times b$ 中的最大值即可。
6161

6262
时间复杂度 $(2^n \times n + 3^n)$,空间复杂度 $O(2^n)$。其中 $n$ 为字符串 $s$ 的长度。
6363

solution/2000-2099/2006.Count Number of Pairs With Absolute Difference K/README.md

Lines changed: 56 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -59,11 +59,21 @@
5959

6060
<!-- 这里可写通用的实现逻辑 -->
6161

62-
**方法一:暴力法**
62+
**方法一:暴力枚举**
6363

64-
由于 nums 长度范围是 `[1,200]`,故可以直接双重循环遍历计数
64+
我们注意到,数组 `nums` 的长度不超过 $200$,因此我们可以枚举所有的数对 $(i, j)$,其中 $i < j$,并判断 $|nums[i] - nums[j]|$ 是否等于 $k$,是则答案加一
6565

66-
**方法二:哈希表计数,一次遍历**
66+
最后返回答案即可。
67+
68+
时间复杂度 $O(n^2)$,空间复杂度 $O(1)$。其中 $n$ 为数组 `nums` 的长度。
69+
70+
**方法二:哈希表或数组**
71+
72+
我们可以使用哈希表或数组记录数组 `nums` 中每个数出现的次数,然后枚举数组 `nums` 中的每个数 $x$,判断 $x + k$ 和 $x - k$ 是否在数组 `nums` 中,是则答案加上 $x+k$ 和 $x-k$ 出现的次数之和。
73+
74+
最后返回答案即可。
75+
76+
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为数组 `nums` 的长度。
6777

6878
<!-- tabs:start -->
6979

@@ -74,22 +84,18 @@
7484
```python
7585
class Solution:
7686
def countKDifference(self, nums: List[int], k: int) -> int:
77-
ans, n = 0, len(nums)
78-
for i in range(n):
79-
for j in range(i + 1, n):
80-
if abs(nums[i] - nums[j]) == k:
81-
ans += 1
82-
return ans
87+
n = len(nums)
88+
return sum(abs(nums[i] - nums[j]) == k for i in range(n) for j in range(i + 1, n))
8389
```
8490

8591
```python
8692
class Solution:
8793
def countKDifference(self, nums: List[int], k: int) -> int:
8894
ans = 0
89-
counter = Counter()
95+
cnt = Counter()
9096
for num in nums:
91-
ans += counter[num - k] + counter[num + k]
92-
counter[num] += 1
97+
ans += cnt[num - k] + cnt[num + k]
98+
cnt[num] += 1
9399
return ans
94100
```
95101

@@ -117,35 +123,21 @@ class Solution {
117123
class Solution {
118124
public int countKDifference(int[] nums, int k) {
119125
int ans = 0;
120-
int[] counter = new int[110];
126+
int[] cnt = new int[110];
121127
for (int num : nums) {
122128
if (num >= k) {
123-
ans += counter[num - k];
129+
ans += cnt[num - k];
124130
}
125131
if (num + k <= 100) {
126-
ans += counter[num + k];
132+
ans += cnt[num + k];
127133
}
128-
++counter[num];
134+
++cnt[num];
129135
}
130136
return ans;
131137
}
132138
}
133139
```
134140

135-
### **TypeScript**
136-
137-
```ts
138-
function countKDifference(nums: number[], k: number): number {
139-
let ans = 0;
140-
let cnt = new Map();
141-
for (let num of nums) {
142-
ans += (cnt.get(num - k) || 0) + (cnt.get(num + k) || 0);
143-
cnt.set(num, (cnt.get(num) || 0) + 1);
144-
}
145-
return ans;
146-
}
147-
```
148-
149141
### **C++**
150142

151143
```cpp
@@ -154,9 +146,11 @@ public:
154146
int countKDifference(vector<int>& nums, int k) {
155147
int n = nums.size();
156148
int ans = 0;
157-
for (int i = 0; i < n; ++i)
158-
for (int j = i + 1; j < n; ++j)
159-
if (abs(nums[i] - nums[j]) == k) ++ans;
149+
for (int i = 0; i < n; ++i) {
150+
for (int j = i + 1; j < n; ++j) {
151+
ans += abs(nums[i] - nums[j]) == k;
152+
}
153+
}
160154
return ans;
161155
}
162156
};
@@ -167,12 +161,15 @@ class Solution {
167161
public:
168162
int countKDifference(vector<int>& nums, int k) {
169163
int ans = 0;
170-
vector<int> counter(110);
171-
for (int num : nums)
172-
{
173-
if (num >= k) ans += counter[num - k];
174-
if (num + k <= 100) ans += counter[num + k];
175-
++counter[num];
164+
int cnt[110]{};
165+
for (int num : nums) {
166+
if (num >= k) {
167+
ans += cnt[num - k];
168+
}
169+
if (num + k <= 100) {
170+
ans += cnt[num + k];
171+
}
172+
++cnt[num];
176173
}
177174
return ans;
178175
}
@@ -204,19 +201,32 @@ func abs(x int) int {
204201
```
205202

206203
```go
207-
func countKDifference(nums []int, k int) int {
208-
ans := 0
209-
counter := make([]int, 110)
204+
func countKDifference(nums []int, k int) (ans int) {
205+
cnt := [110]int{}
210206
for _, num := range nums {
211207
if num >= k {
212-
ans += counter[num-k]
208+
ans += cnt[num-k]
213209
}
214210
if num+k <= 100 {
215-
ans += counter[num+k]
211+
ans += cnt[num+k]
216212
}
217-
counter[num]++
213+
cnt[num]++
218214
}
219-
return ans
215+
return
216+
}
217+
```
218+
219+
### **TypeScript**
220+
221+
```ts
222+
function countKDifference(nums: number[], k: number): number {
223+
let ans = 0;
224+
let cnt = new Map();
225+
for (let num of nums) {
226+
ans += (cnt.get(num - k) || 0) + (cnt.get(num + k) || 0);
227+
cnt.set(num, (cnt.get(num) || 0) + 1);
228+
}
229+
return ans;
220230
}
221231
```
222232

solution/2000-2099/2006.Count Number of Pairs With Absolute Difference K/README_EN.md

Lines changed: 43 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -63,22 +63,18 @@
6363
```python
6464
class Solution:
6565
def countKDifference(self, nums: List[int], k: int) -> int:
66-
ans, n = 0, len(nums)
67-
for i in range(n):
68-
for j in range(i + 1, n):
69-
if abs(nums[i] - nums[j]) == k:
70-
ans += 1
71-
return ans
66+
n = len(nums)
67+
return sum(abs(nums[i] - nums[j]) == k for i in range(n) for j in range(i + 1, n))
7268
```
7369

7470
```python
7571
class Solution:
7672
def countKDifference(self, nums: List[int], k: int) -> int:
7773
ans = 0
78-
counter = Counter()
74+
cnt = Counter()
7975
for num in nums:
80-
ans += counter[num - k] + counter[num + k]
81-
counter[num] += 1
76+
ans += cnt[num - k] + cnt[num + k]
77+
cnt[num] += 1
8278
return ans
8379
```
8480

@@ -104,35 +100,21 @@ class Solution {
104100
class Solution {
105101
public int countKDifference(int[] nums, int k) {
106102
int ans = 0;
107-
int[] counter = new int[110];
103+
int[] cnt = new int[110];
108104
for (int num : nums) {
109105
if (num >= k) {
110-
ans += counter[num - k];
106+
ans += cnt[num - k];
111107
}
112108
if (num + k <= 100) {
113-
ans += counter[num + k];
109+
ans += cnt[num + k];
114110
}
115-
++counter[num];
111+
++cnt[num];
116112
}
117113
return ans;
118114
}
119115
}
120116
```
121117

122-
### **TypeScript**
123-
124-
```ts
125-
function countKDifference(nums: number[], k: number): number {
126-
let ans = 0;
127-
let cnt = new Map();
128-
for (let num of nums) {
129-
ans += (cnt.get(num - k) || 0) + (cnt.get(num + k) || 0);
130-
cnt.set(num, (cnt.get(num) || 0) + 1);
131-
}
132-
return ans;
133-
}
134-
```
135-
136118
### **C++**
137119

138120
```cpp
@@ -141,9 +123,11 @@ public:
141123
int countKDifference(vector<int>& nums, int k) {
142124
int n = nums.size();
143125
int ans = 0;
144-
for (int i = 0; i < n; ++i)
145-
for (int j = i + 1; j < n; ++j)
146-
if (abs(nums[i] - nums[j]) == k) ++ans;
126+
for (int i = 0; i < n; ++i) {
127+
for (int j = i + 1; j < n; ++j) {
128+
ans += abs(nums[i] - nums[j]) == k;
129+
}
130+
}
147131
return ans;
148132
}
149133
};
@@ -154,12 +138,15 @@ class Solution {
154138
public:
155139
int countKDifference(vector<int>& nums, int k) {
156140
int ans = 0;
157-
vector<int> counter(110);
158-
for (int num : nums)
159-
{
160-
if (num >= k) ans += counter[num - k];
161-
if (num + k <= 100) ans += counter[num + k];
162-
++counter[num];
141+
int cnt[110]{};
142+
for (int num : nums) {
143+
if (num >= k) {
144+
ans += cnt[num - k];
145+
}
146+
if (num + k <= 100) {
147+
ans += cnt[num + k];
148+
}
149+
++cnt[num];
163150
}
164151
return ans;
165152
}
@@ -191,19 +178,32 @@ func abs(x int) int {
191178
```
192179

193180
```go
194-
func countKDifference(nums []int, k int) int {
195-
ans := 0
196-
counter := make([]int, 110)
181+
func countKDifference(nums []int, k int) (ans int) {
182+
cnt := [110]int{}
197183
for _, num := range nums {
198184
if num >= k {
199-
ans += counter[num-k]
185+
ans += cnt[num-k]
200186
}
201187
if num+k <= 100 {
202-
ans += counter[num+k]
188+
ans += cnt[num+k]
203189
}
204-
counter[num]++
190+
cnt[num]++
205191
}
206-
return ans
192+
return
193+
}
194+
```
195+
196+
### **TypeScript**
197+
198+
```ts
199+
function countKDifference(nums: number[], k: number): number {
200+
let ans = 0;
201+
let cnt = new Map();
202+
for (let num of nums) {
203+
ans += (cnt.get(num - k) || 0) + (cnt.get(num + k) || 0);
204+
cnt.set(num, (cnt.get(num) || 0) + 1);
205+
}
206+
return ans;
207207
}
208208
```
209209

solution/2000-2099/2006.Count Number of Pairs With Absolute Difference K/Solution.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,15 @@ class Solution {
22
public:
33
int countKDifference(vector<int>& nums, int k) {
44
int ans = 0;
5-
vector<int> counter(110);
5+
int cnt[110]{};
66
for (int num : nums) {
7-
if (num >= k) ans += counter[num - k];
8-
if (num + k <= 100) ans += counter[num + k];
9-
++counter[num];
7+
if (num >= k) {
8+
ans += cnt[num - k];
9+
}
10+
if (num + k <= 100) {
11+
ans += cnt[num + k];
12+
}
13+
++cnt[num];
1014
}
1115
return ans;
1216
}
Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
1-
func countKDifference(nums []int, k int) int {
2-
ans := 0
3-
counter := make([]int, 110)
1+
func countKDifference(nums []int, k int) (ans int) {
2+
cnt := [110]int{}
43
for _, num := range nums {
54
if num >= k {
6-
ans += counter[num-k]
5+
ans += cnt[num-k]
76
}
87
if num+k <= 100 {
9-
ans += counter[num+k]
8+
ans += cnt[num+k]
109
}
11-
counter[num]++
10+
cnt[num]++
1211
}
13-
return ans
12+
return
1413
}

solution/2000-2099/2006.Count Number of Pairs With Absolute Difference K/Solution.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
class Solution {
22
public int countKDifference(int[] nums, int k) {
33
int ans = 0;
4-
int[] counter = new int[110];
4+
int[] cnt = new int[110];
55
for (int num : nums) {
66
if (num >= k) {
7-
ans += counter[num - k];
7+
ans += cnt[num - k];
88
}
99
if (num + k <= 100) {
10-
ans += counter[num + k];
10+
ans += cnt[num + k];
1111
}
12-
++counter[num];
12+
++cnt[num];
1313
}
1414
return ans;
1515
}
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
class Solution:
22
def countKDifference(self, nums: List[int], k: int) -> int:
33
ans = 0
4-
counter = Counter()
4+
cnt = Counter()
55
for num in nums:
6-
ans += counter[num - k] + counter[num + k]
7-
counter[num] += 1
6+
ans += cnt[num - k] + cnt[num + k]
7+
cnt[num] += 1
88
return ans

0 commit comments

Comments
 (0)