Leetcode每日一题练习 ------ 1497. 检查数组对是否可以被 k 整除

Leetcode 每日一题练习继续讨论:

祝各位佬友国庆节快乐!! :partying_face: :partying_face:
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;
    }
};
1 个赞

来了!刷题佬!

1 个赞