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;
    }
}

  

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