1497. Check If Array Pairs Are Divisible by k

Medium

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

解題

這題只要懂數學原理就會很簡單。

1 % 5 = 1

2 % 5 = 2

3 % 5 = 3

4 % 5 = 4

5 % 5 = 0

6 % 5 = 1

7 % 5 = 2

8 % 5 = 3

9 % 5 = 4

10 % 5 = 0

如果把餘數為 1 的 1 和 餘數為 4 的 9 相加,得到的 10 餘數為 0 。

因此我們可以建個陣列來記錄餘數的數量,再檢查相加等於 k 的兩個餘數數量是否相等。此外,因為題目說陣列長度為偶數,等於 0 的餘數數量也必須是偶數。

Runtime: 109 ms, faster than 90.16%

Memory Usage: 9 MB, less than 91.80%

func canArrange(arr []int, k int) bool {
    count := make([]int, k)
    
    for _, val := range arr {
        n := val % k
        if n<0 { n +=k }
        
        count[n]++
    }
    
    for _, val := range arr {
        rem1 := val % k
        if rem1<0 { rem1+=k }
        
        if rem1==0 {
            if count[0]%2 !=0 { return false }
        } else {
            rem2 := k-rem1
            if count[rem1] != count[rem2] { return false }
        }
    }
    
    return true
}

Last updated