[LeetCode] 1497. Check If Array Pairs Are Divisible by k

CNoodle發表於2024-10-02

Given an array of integers arr of even length n and an integer k.

We want to divide the array into exactly n / 2 pairs such that the sum of each pair is divisible by k.

Return true If you can find a way to do that or false otherwise.

Example 1:
Input: arr = [1,2,3,4,5,10,6,7,8,9], k = 5
Output: true
Explanation: Pairs are (1,9),(2,8),(3,7),(4,6) and (5,10).

Example 2:
Input: arr = [1,2,3,4,5,6], k = 7
Output: true
Explanation: Pairs are (1,6),(2,5) and(3,4).

Example 3:
Input: arr = [1,2,3,4,5,6], k = 10
Output: false
Explanation: You can try all possible pairs to see that there is no way to divide arr into 3 pairs each with sum divisible by 10.

Constraints:
arr.length == n
1 <= n <= 105
n is even.
-109 <= arr[i] <= 109
1 <= k <= 105

檢查陣列對是否可以被 k 整除。

給你一個整數陣列 arr 和一個整數 k ,其中陣列長度是偶數,值為 n 。

現在需要把陣列恰好分成 n / 2 對,以使每對數字的和都能夠被 k 整除。

如果存在這樣的分法,請返回 true ;否則,返回 false。

思路

如何判斷某兩個數字 a + b 的和是否可以被 k 整除?這裡分兩種情況

  • a 和 b 各自都能被 k 整除,那麼 a + b 也應該可以被 k 整除。比如 a = 9, b = 6, k = 3, a + b = 15, 15 % 3 = 0
  • a 和 b 不能同時被 k 整除,但是 a % k + b % k 可以被 k 整除。比如 a = 8, b = 1, k = 9, a % k + b % k = 8 + 1 = 9 % 9 = 0

上面的推論不難得到。這道題還有第二個需要注意的點就是 input 裡是有負數的。即使有負數我們也無需擔心,上面提到的模運算的結合律還是成立的。這裡可以手動算一下就知道。

具體做法是這裡我們需要處理一下 input 陣列裡的每一個數字,因為他們有正有負,這裡我把他們統統處理成比 k 小的正數,然後我們找與其配對的數字的時候就會比較容易了。

複雜度

時間O(n)
空間O(n)

程式碼

Java實現

class Solution {
    public boolean canArrange(int[] arr, int k) {
        int n = arr.length;
        HashMap<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < n; i++) {
            int temp = arr[i] % k;
            if (temp < 0) {
                temp += k;
            }
            map.put(temp, map.getOrDefault(temp, 0) + 1);
        }

        for (Integer key : map.keySet()) {
            if (key != 0) {
                int x = map.get(key);
                int y = map.getOrDefault(k - key, 0);
                if (x != y) {
                    return false;
                }
            } else if (map.get(0) % 2 != 0) {
                return false;
            }
        }
        return true;
    }
}

相關文章