题目:
给你一个整数数组 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
}