题意:给你一个整数数组 arr 和一个整数 k ,其中数组长度是偶数,值为 n 。
现在需要把数组恰好分成 n / 2 对,以使每对数字的和都能够被 k 整除。
如果存在这样的分法,请返回 True ;否则,返回 False 。
思路:用一个map记下模后值为x的所有数的个数。然后遍历数组,每次找到与它配对的值,map对应的值减1。这里需要注意的是负数的取模,直接用c++的取模运算得到的结果不符合题意,所以对于负数取模重新算一下。a%b = a - 向下取整(a/b) * b;
C++代码:
class Solution {
public:
map<int, int> mp;
bool canArrange(vector<int>& arr, int k) {
sort(arr.begin(), arr.end());
for(int i = 0; i < arr.size(); i++){
int tmp = arr[i] % k;
if(arr[i] < 0){
if(arr[i] / k * k == arr[i]) tmp = arr[i] - arr[i];
else tmp = arr[i] - (arr[i] / k - 1) * k;
}
mp[tmp]++;
}
for(int i = 0; i < arr.size(); i++){
int tmp = arr[i] % k;
if(arr[i] < 0){
if(arr[i] / k * k == arr[i]) tmp = arr[i] - arr[i];
else tmp = arr[i] - (arr[i] / k - 1) * k;
}
if(mp[tmp] == 0) continue;
mp[tmp]--;
if(tmp == 0) tmp = k;
if(mp.find(k - tmp) == mp.end() || mp[k - tmp] == 0){
return false;
}
else if(mp.find(k - tmp) != mp.end()) mp[k - tmp]--;
}
return true;
}
};