954.二倍数对数组
954.二倍数对数组
题解
题目就是在问,元素中一个数是另一个数的两倍,能不能刚刚好全满足这个条件,即元素为x,需要找到2x的数,如果没有就不满足返回false。
这里用map记录每个数出现的次数,用temp存去重之后的数组,遍历数组,如果mp[v]<=mp[2v],则说明所有的v都能找到匹配自己的2v,如果不满足则返回false。2*v的元素被匹配掉多少个,要响应的减去多少个,因为1 1 2 2 2 4,最后一个2还要去匹配4
代码
func canReorderDoubled(arr []int) bool { mp := make(map[int]int) for _, v := range mp { mp[v]++ } temp := make([]int, 0) for k := range mp { temp = append(temp, k) } sort.Slice(temp, func(i, j int) bool { return abs(temp[i]) < abs(temp[j]) }) for _, v := range temp { //为什么是大于,而不是不等于? //1 1 2 2 2 4 //1有两个,2有3个,其中一个2是去匹配4的 //只要v的数量<=2v的数量,就满足v的要求了 if mp[v] > mp[2*v] { return false } mp[2*v] -= mp[v] } return true } func abs(i int) int { if i < 0 { return -i } return i }