从Leetcode 每日一题练习继续讨论:
祝各位佬友国庆节快乐!!
1497. 检查数组对是否可以被 k 整除
1497. Check If Array Pairs Are Divisible by k
题解
本题要将全部数字分为两两一组,并要求每组中的两个数组和可以被k整除。对于整除的问题,一般可以通过取模将余数相同的数字筛选出来,这些数字可视为拥有相同的“性质”,无需关心其原本的数字大小。想实现组合的两个数字可以被k整除,只需这两个数字对k取模后的余数和可以被k整除。则统计各个余数对应的数字个数,再按照余数和为k将对应的组组合(如k=5,则余数为1和余数为4的数字个数相同,则这两个组的数字可以两两配对使得其被k整除),看两个组的数字个数是否相同,全部相同且余数为0的组的个数为偶数,则能够组合成功,否则不能。
注意本题中数字可能为负数,则要考虑负数取模的情况。在c++和其他一些语言中,对负数取模,计算方式是先绝对值取模再根据原数字的符号添加符号。如-1%5=-1
。为了让负数取模的结果也为正数,即数学中的取模方式,可以用(num%k+k)%k
使得正负数均得到正数的模。
代码
class Solution {
public:
bool canArrange(vector<int>& arr, int k) {
vector <vector<int>> remain(k);
for (int num : arr){
remain[(num%k+k)%k].push_back(num);
}
if (remain[0].size() % 2 == 1){
return false;
}
if (k%2 == 1){
for (int i=1; i<=k/2;i++){
if (remain[i].size() != remain[k-i].size()){
return false;
}
}
}else{
for (int i=1; i<k/2;i++){
if (remain[i].size() != remain[k-i].size()){
return false;
}
}
if (remain[k/2].size()%2 == 1){
return false;
}
}
return true;
}
};