Skip to content

Commit 1db6307

Browse files
committed
feat: add solutions to lc problem: No.1497
No.1497.Check If Array Pairs Are Divisible by k
1 parent 3deebd5 commit 1db6307

File tree

6 files changed

+69
-60
lines changed

6 files changed

+69
-60
lines changed

solution/1400-1499/1497.Check If Array Pairs Are Divisible by k/README.md

Lines changed: 27 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,13 @@
5454

5555
<!-- 这里可写通用的实现逻辑 -->
5656

57-
两个数 a 和 b 的和能被 k 整除,当且仅当这两个数对 k 取模的结果 ak 和 bk 的和就能被 k 整除。
57+
**方法一:统计余数**
5858

59-
- 如果 ak = 0,需要找到另一个满足 bk = 0 的 b 进行配对;
60-
- 如果 ak > 0,需要找到另一个满足 bk = k - ak 的 b 进行配对。
59+
两个数 $a$ 和 $b$ 的和能被 $k$ 整除,当且仅当这两个数分别对 $k$ 取模的结果之和能被 $k$ 整除。
60+
61+
因此,我们可以统计数组中每个数对 $k$ 取模的结果,即余数,记录在数组 `cnt` 中。然后我们遍历数组 `cnt`,对于范围在 $[1,..k-1]$ 的每个数 $i$,如果 $cnt[i]$ 和 $cnt[k-i]$ 的值不相等,说明无法将数组中的数字分为 $n/2$ 对,使得每对数字的和都能被 $k$ 整除。如果 $cnt[0]$ 的值不是偶数,也说明无法将数组中的数字分为 $n/2$ 对,使得每对数字的和都能被 $k$ 整除。
62+
63+
时间复杂度 $O(n)$,空间复杂度 $O(k)$。其中 $n$ 为数组 `arr` 的长度。
6164

6265
<!-- tabs:start -->
6366

@@ -68,10 +71,8 @@
6871
```python
6972
class Solution:
7073
def canArrange(self, arr: List[int], k: int) -> bool:
71-
mod = [0] * k
72-
for v in arr:
73-
mod[v % k] += 1
74-
return all(mod[i] == mod[k - i] for i in range(1, k)) and mod[0] % 2 == 0
74+
cnt = Counter(x % k for x in arr)
75+
return cnt[0] % 2 == 0 and all(cnt[i] == cnt[k - i] for i in range(1, k))
7576
```
7677

7778
### **Java**
@@ -81,16 +82,16 @@ class Solution:
8182
```java
8283
class Solution {
8384
public boolean canArrange(int[] arr, int k) {
84-
int[] mod = new int[k];
85-
for (int v : arr) {
86-
++mod[(v % k + k) % k];
85+
int[] cnt = new int[k];
86+
for (int x : arr) {
87+
++cnt[(x % k + k) % k];
8788
}
8889
for (int i = 1; i < k; ++i) {
89-
if (mod[i] != mod[k - i]) {
90+
if (cnt[i] != cnt[k - i]) {
9091
return false;
9192
}
9293
}
93-
return mod[0] % 2 == 0;
94+
return cnt[0] % 2 == 0;
9495
}
9596
}
9697
```
@@ -101,12 +102,16 @@ class Solution {
101102
class Solution {
102103
public:
103104
bool canArrange(vector<int>& arr, int k) {
104-
vector<int> mod(k);
105-
for (int v : arr) ++mod[(v % k + k) % k];
106-
for (int i = 1; i < k; ++i)
107-
if (mod[i] != mod[k - i])
105+
vector<int> cnt(k);
106+
for (int& x : arr) {
107+
++cnt[((x % k) + k) % k];
108+
}
109+
for (int i = 1; i < k; ++i) {
110+
if (cnt[i] != cnt[k - i]) {
108111
return false;
109-
return mod[0] % 2 == 0;
112+
}
113+
}
114+
return cnt[0] % 2 == 0;
110115
}
111116
};
112117
```
@@ -115,16 +120,16 @@ public:
115120
116121
```go
117122
func canArrange(arr []int, k int) bool {
118-
mod := make([]int, k)
119-
for _, v := range arr {
120-
mod[(v%k+k)%k]++
123+
cnt := make([]int, k)
124+
for _, x := range arr {
125+
cnt[(x%k+k)%k]++
121126
}
122127
for i := 1; i < k; i++ {
123-
if mod[i] != mod[k-i] {
128+
if cnt[i] != cnt[k-i] {
124129
return false
125130
}
126131
}
127-
return mod[0]%2 == 0
132+
return cnt[0]%2 == 0
128133
}
129134
```
130135

solution/1400-1499/1497.Check If Array Pairs Are Divisible by k/README_EN.md

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -55,27 +55,25 @@
5555
```python
5656
class Solution:
5757
def canArrange(self, arr: List[int], k: int) -> bool:
58-
mod = [0] * k
59-
for v in arr:
60-
mod[v % k] += 1
61-
return all(mod[i] == mod[k - i] for i in range(1, k)) and mod[0] % 2 == 0
58+
cnt = Counter(x % k for x in arr)
59+
return cnt[0] % 2 == 0 and all(cnt[i] == cnt[k - i] for i in range(1, k))
6260
```
6361

6462
### **Java**
6563

6664
```java
6765
class Solution {
6866
public boolean canArrange(int[] arr, int k) {
69-
int[] mod = new int[k];
70-
for (int v : arr) {
71-
++mod[(v % k + k) % k];
67+
int[] cnt = new int[k];
68+
for (int x : arr) {
69+
++cnt[(x % k + k) % k];
7270
}
7371
for (int i = 1; i < k; ++i) {
74-
if (mod[i] != mod[k - i]) {
72+
if (cnt[i] != cnt[k - i]) {
7573
return false;
7674
}
7775
}
78-
return mod[0] % 2 == 0;
76+
return cnt[0] % 2 == 0;
7977
}
8078
}
8179
```
@@ -86,12 +84,16 @@ class Solution {
8684
class Solution {
8785
public:
8886
bool canArrange(vector<int>& arr, int k) {
89-
vector<int> mod(k);
90-
for (int v : arr) ++mod[(v % k + k) % k];
91-
for (int i = 1; i < k; ++i)
92-
if (mod[i] != mod[k - i])
87+
vector<int> cnt(k);
88+
for (int& x : arr) {
89+
++cnt[((x % k) + k) % k];
90+
}
91+
for (int i = 1; i < k; ++i) {
92+
if (cnt[i] != cnt[k - i]) {
9393
return false;
94-
return mod[0] % 2 == 0;
94+
}
95+
}
96+
return cnt[0] % 2 == 0;
9597
}
9698
};
9799
```
@@ -100,16 +102,16 @@ public:
100102
101103
```go
102104
func canArrange(arr []int, k int) bool {
103-
mod := make([]int, k)
104-
for _, v := range arr {
105-
mod[(v%k+k)%k]++
105+
cnt := make([]int, k)
106+
for _, x := range arr {
107+
cnt[(x%k+k)%k]++
106108
}
107109
for i := 1; i < k; i++ {
108-
if mod[i] != mod[k-i] {
110+
if cnt[i] != cnt[k-i] {
109111
return false
110112
}
111113
}
112-
return mod[0]%2 == 0
114+
return cnt[0]%2 == 0
113115
}
114116
```
115117

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
class Solution {
22
public:
33
bool canArrange(vector<int>& arr, int k) {
4-
vector<int> mod(k);
5-
for (int v : arr) ++mod[(v % k + k) % k];
6-
for (int i = 1; i < k; ++i)
7-
if (mod[i] != mod[k - i])
4+
vector<int> cnt(k);
5+
for (int& x : arr) {
6+
++cnt[((x % k) + k) % k];
7+
}
8+
for (int i = 1; i < k; ++i) {
9+
if (cnt[i] != cnt[k - i]) {
810
return false;
9-
return mod[0] % 2 == 0;
11+
}
12+
}
13+
return cnt[0] % 2 == 0;
1014
}
1115
};
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
func canArrange(arr []int, k int) bool {
2-
mod := make([]int, k)
3-
for _, v := range arr {
4-
mod[(v%k+k)%k]++
2+
cnt := make([]int, k)
3+
for _, x := range arr {
4+
cnt[(x%k+k)%k]++
55
}
66
for i := 1; i < k; i++ {
7-
if mod[i] != mod[k-i] {
7+
if cnt[i] != cnt[k-i] {
88
return false
99
}
1010
}
11-
return mod[0]%2 == 0
11+
return cnt[0]%2 == 0
1212
}
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
class Solution {
22
public boolean canArrange(int[] arr, int k) {
3-
int[] mod = new int[k];
4-
for (int v : arr) {
5-
++mod[(v % k + k) % k];
3+
int[] cnt = new int[k];
4+
for (int x : arr) {
5+
++cnt[(x % k + k) % k];
66
}
77
for (int i = 1; i < k; ++i) {
8-
if (mod[i] != mod[k - i]) {
8+
if (cnt[i] != cnt[k - i]) {
99
return false;
1010
}
1111
}
12-
return mod[0] % 2 == 0;
12+
return cnt[0] % 2 == 0;
1313
}
1414
}
Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
class Solution:
22
def canArrange(self, arr: List[int], k: int) -> bool:
3-
mod = [0] * k
4-
for v in arr:
5-
mod[v % k] += 1
6-
return all(mod[i] == mod[k - i] for i in range(1, k)) and mod[0] % 2 == 0
3+
cnt = Counter(x % k for x in arr)
4+
return cnt[0] % 2 == 0 and all(cnt[i] == cnt[k - i] for i in range(1, k))

0 commit comments

Comments
 (0)