一、Problem
給你一個整數數組 arr 和一個整數 k ,其中數組長度是偶數,值爲 n 。
現在需要把數組恰好分成 n / 2 對,以使每對數字的和都能夠被 k 整除。
如果存在這樣的分法,請返回 True ;否則,返回 False 。
輸入:arr = [1,2,3,4,5,10,6,7,8,9], k = 5
輸出:true
解釋:劃分後的數字對爲 (1,9),(2,8),(3,7),(4,6) 以及 (5,10) 。
輸入:arr = [-1,1,-2,2,-3,3,-4,4], k = 3
輸出:true
提示:
arr.length == n
1 <= n <= 10^5
n 爲偶數
-10^9 <= arr[i] <= 10^9
1 <= k <= 10^5
二、Solution
方法一:檢查成對的餘數
思路
數組中要找到 n/2 對匹配的數字對的話,那麼數組中對 k 取模且餘數爲 和對 取模餘數爲 k-i 的數字的個數應該是相等的,比如:
a = [0,1, 2, 3, 4,5],k = 5
0%5 = 0
1%5 = 1
2%5 = 2
3%5 = 3
4%5 = 4
5%5 = 0
cnt[0] % 2 == 0,cnt[1] = cnt[5-1],cnt[2] = cnt[5-3],故該數組合法
細節
如果數字爲負數時,負數取模得到的還會是負數,所以我們要將其轉爲正數
class Solution {
public boolean canArrange(int[] a, int k) {
int m[] = new int[k];
for (int x : a) m[(x%k+k)%k]++;
for (int i = 1; i < k; i++) if (m[i] != m[k-i])
return false;
return (m[0] & 1) == 0;
}
}
我看到還有一些同學是對數組求和然後判斷 % k 是否等於 0 的,這是不對的,比如
[1,1,1,1],k = 4
2%4 = 2
2%4 = 2
無論如何也找不到合法數字對
複雜度分析
- 時間複雜度:,
- 空間複雜度:,