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

110 阅读1分钟

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

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

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

算法:
方法一:hash表
思路:容易想到以前做过类似的题目两数sum,在那个题目中,可以用hash表计算sum - num的出现次数求解。但是在该题中,sum可能是k, 2k, 3k, 4k....。
因此我们能不能想办法缩小k的范围?注意到是数字的和被K整除:(a + b)% k = a % k + b % k 我们可以对每个arr的元素求余,将数据缩小到0~k-1

func canArrange(arr []int, k int) bool {
    numModCount := make(map[int]int)
    for i := range arr {
        numModCount[(arr[i] % k + k) % k] ++
    }
    if numModCount[0] % 2 != 0 {
        return false
    }
    delete(numModCount, 0)
    for num, count := range numModCount {
        if numModCount[k - num] != count {
            return false
        }
        delete(numModCount, num)
        delete(numModCount, k - num)
    }
    return true
}