LeetCode 1497. 检查数组对是否可以被k整除

题意:给你一个整数数组 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;

    }

};

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。