Given an array of integers arr of even length n and an integer k.
We want to divide the array into exactly n / 2 pairs such that the sum of each pair is divisible by k.
Return true If you can find a way to do that or false otherwise.
Example 1:
Input: arr = [1,2,3,4,5,10,6,7,8,9], k = 5
Output: true
Explanation: Pairs are (1,9),(2,8),(3,7),(4,6) and (5,10).
Example 2:
Input: arr = [1,2,3,4,5,6], k = 7
Output: true
Explanation: Pairs are (1,6),(2,5) and(3,4).
Example 3:
Input: arr = [1,2,3,4,5,6], k = 10
Output: false
Explanation: You can try all possible pairs to see that there is no way to divide arr into 3 pairs each with sum divisible by 10.
Constraints:
arr.length == n
1 <= n <= 105
n is even.
-109 <= arr[i] <= 109
1 <= k <= 105
檢查陣列對是否可以被 k 整除。
給你一個整數陣列 arr 和一個整數 k ,其中陣列長度是偶數,值為 n 。現在需要把陣列恰好分成 n / 2 對,以使每對數字的和都能夠被 k 整除。
如果存在這樣的分法,請返回 true ;否則,返回 false。
思路
如何判斷某兩個數字 a + b 的和是否可以被 k 整除?這裡分兩種情況
- a 和 b 各自都能被 k 整除,那麼 a + b 也應該可以被 k 整除。比如 a = 9, b = 6, k = 3, a + b = 15, 15 % 3 = 0
- a 和 b 不能同時被 k 整除,但是 a % k + b % k 可以被 k 整除。比如 a = 8, b = 1, k = 9, a % k + b % k = 8 + 1 = 9 % 9 = 0
上面的推論不難得到。這道題還有第二個需要注意的點就是 input 裡是有負數的。即使有負數我們也無需擔心,上面提到的模運算的結合律還是成立的。這裡可以手動算一下就知道。
具體做法是這裡我們需要處理一下 input 陣列裡的每一個數字,因為他們有正有負,這裡我把他們統統處理成比 k 小的正數,然後我們找與其配對的數字的時候就會比較容易了。
複雜度
時間O(n)
空間O(n)
程式碼
Java實現
class Solution {
public boolean canArrange(int[] arr, int k) {
int n = arr.length;
HashMap<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < n; i++) {
int temp = arr[i] % k;
if (temp < 0) {
temp += k;
}
map.put(temp, map.getOrDefault(temp, 0) + 1);
}
for (Integer key : map.keySet()) {
if (key != 0) {
int x = map.get(key);
int y = map.getOrDefault(k - key, 0);
if (x != y) {
return false;
}
} else if (map.get(0) % 2 != 0) {
return false;
}
}
return true;
}
}