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

题目

给你一个整数数组 arr 和一个整数 k ,其中数组长度是偶数,值为 n 。

现在需要把数组恰好分成 n / 2 对,以使每对数字的和都能够被 k 整除。

如果存在这样的分法,请返回 True ;否则,返回 False 。


示例 1:

输入:arr = [1,2,3,4,5,10,6,7,8,9], k = 5
输出:true
解释:划分后的数字对为 (1,9),(2,8),(3,7),(4,6) 以及 (5,10) 。


示例 2:

输入:arr = [1,2,3,4,5,6], k = 7
输出:true
解释:划分后的数字对为 (1,6),(2,5) 以及 (3,4) 。


示例 3:

输入:arr = [1,2,3,4,5,6], k = 10
输出:false
解释:无法在将数组中的数字分为三对的同时满足每对数字和能够被 10 整除的条件。


示例 4:

输入:arr = [-10,10], k = 2
输出:true
示例 5:

输入:arr = [-1,1,-2,2,-3,3,-4,4], k = 3
输出:true


提示:

arr.length == n
1 <= n <= 10^5
n 为偶数
-10^9 <= arr[i] <= 10^9
1 <= k <= 10^5

分析

万万没想到本题是数学类题目。主要思路是:定义数组 mod,mod[i] 存模值为 i 的元素的个数,然后看 mod[i] 和 mod[k - i] 的个数是否相等,如果不相等就不能相配。对于 mod[0] ,检查是否为偶数。

再复习一下 取模(mod) 和取余 的区别。

简单点说:取余运算(Java 中为 %)在求商时向 0 舍弃小数位;而取模运算(Java 中为 Math.floorMod()) 在求商时向负无穷舍弃小数位

如:4 / -3 = -1.33333...., 如果计算 4 % (-3), 向 0 舍弃小数位,商为 -1,取余结果:4 - (-1) * (-3) = 1;如果计算 Math.floorMod(4, -3), 向负无穷舍弃小数位,商为 -2,取模结果:4 - (-2) * (-3) = -2。数学中说的模就是 Math.floorMod()。

代码

class Solution {
    public boolean canArrange(int[] arr, int k) {
        int[] mod = new int[k];
        for (int i = 0; i < arr.length; i++) {
            mod[Math.floorMod(arr[i], k)]++;
        }
        for (int i = 1; i < k / 2; i++) {
            if (mod[i] != mod[k - i]) return false;
        }
        return (mod[0] & 1) == 0;
    }
}

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章