见极客时间03
- 检查数组对是否可以被 k 整除
给你一个整数数组 arr 和一个整数 k ,其中数组长度是偶数,值为 n 。现在需要把数组恰好分成 n / 2 对,以使每对数字的和都能够被 k 整除。
如果存在这样的分法,请返回 True ;否则,返回 False 。
时间复杂度:先遍历数组O(n),再遍历哈希表,哈希表中放对k取余的余数,共k个键(0~k-1)。
故O(n+k)
空间复杂度:哈希表 O(k)
func canArrange(arr []int, k int) bool {
//A:数组中原数字
//a:A对k取余后的结果,均转换为正数
//要想(A+B)%k = 0,得a+b = 0/k(要想两数之和整除k,两数对k求余之和必须等于k/0
//eg. (2+6)%2 = 0,得2%2 + 6%2 = 0
//eg. (2+5)%7 = 0,的2%7 + 5%7 = 7
//1.map键:对每个数求的余数 value:余数出现的次数
//2.两数对k求余之和等于k:
//对于余数1~k-1,其中每个余数i出现的次数,k-i出现的次数要能和相等匹配
//3.两数对k求余之和等于0:
//余数0出现的次数必须是偶数
m := make(map[int]int)
for _,v := range arr {
mod := (v % k + k) % k //mod必须是正数
m[mod]++
}
for key := range m {
if key != 0 && m[key] != m[k-key] {
return false
}else if key == 0 && m[key] % 2 != 0 {
return false
}
}
return true
}