开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第22天,点击查看活动详情
二倍数对数组
给定一个长度为偶数的整数数组 arr,只有对 arr 进行重组后可以满足 “对于每个 0 <= i < len(arr) / 2,都有 arr[2 * i + 1] = 2 * arr[2 * i]” 时,返回 true;否则,返回 false。
示例1:
输入: arr = [3,1,3,6]
输出: false
示例2:
输入: arr = [2,1,2,6]
输出: false
示例3:
输入:arr = [4,-2,2,-4]
输出:true
解释:可以用 [-2,-4] 和 [2,4] 这两组组成 [-2,-4,2,4] 或是 [2,4,-2,-4]
提示:
0 <= arr.length <= 3 * 104arr.length是偶数-105 <= arr[i] <= 105
解题思路:
只有排序后才能解决配对问题 例如:数组[2,4,1,8] 如果 1,2 匹配 4,8匹配 返回true 如果 2,4 匹配 就剩下 1 和 8 不能进行匹配 返回false 关键点就是 2 到底是和1匹配还是和4匹配 根据题意都可以,一个是二倍值一个是半值 但是结果却不一样 为了解决这个问题只能进行排序然后依次匹配 如果升序排序就匹配半值 降序排序就匹配双倍值
记录数组个数记为count,每匹配一对就减去2 如果最后为0,说明完全匹配 返回true 否则返回false
排序后一边遍历一边配对 如果map中没有当前值二倍的值,就把当前值添加到map中,并把出现次数加1 如果存在二倍值,就把map中的二倍值出现次数减1,count中减去2
我的答案:
/**
* @param {number[]} A
* @return {boolean}
*/
var canReorderDoubled = function(A) {
A.sort((a, b) => b - a)
var map = new Map()
var total = A.length
var other = 0
A.forEach(v => {
other = v >= 0 ? v * 2 : v / 2
if(map.get(other) > 0){
total -= 2
map.set(other, map.get(other) - 1)
}else{
map.set(v, map.has(v) ? map.get(v) + 1 : 1)
}
})
return total == 0
};
最后
如果有更好的解法或者思路, 欢迎在评论区和我交流~ ღ( ´・ᴗ・` )