算法
(数学) $O(n)$
我们思考这样一个问题,如果$a+b$能被$k$整除,那么$a$和$b$分别对$k$取余的结果相加也一定能被$k$整除,即$(a%k+b%k)%k=0$。所以我们对$arr$中的圆度分别对$k$取余。即num = num % k
,因为数组中可能会有负数,所以求余的结果也可能为负数,这里为了计算方便,我们把求余的结果全部转化为非负数,大小在$[0, k - 1]$中,包含$0$和$k-1$。所以计算公式是num = (num % k + k) % k
。
这样我们只需要计算余数相对应位置上的个数是否相等
就可以了。还有一点就是$0$的个数必须是偶数。
Java 代码
class Solution {
public boolean canArrange(int[] arr, int k) {
int[] mod = new int[k];
// 统计求余之后各余数的个数
for (int num : arr)
mod[(num % k + k) % k]++;
for (int i = 1; i < k / 2; ++i) {
// 如果对应的个数不匹配,直接返回false
if (mod[i] != mod[k - i])
return false;
}
// 余数中0的个数必须是偶数
return mod[0] % 2 == 0;
}
}