954. 二倍数对数组
二倍数对数组
题目描述:
给定一个长度为偶数的整数数组 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 * 104
arr.length 是偶数
-105 <= arr[i] <= 105
思路:
时间复杂度:O(nlogn),空间复杂度O(n)
这个代码考察的是是不是所有数都是配对的,有两倍关系,所以负数降序,正书升序,然后拼接在一起判断每个数有没有两倍关系的数字。
代码:
func canReorderDoubled(arr []int) bool {
mp := make(map[int]int, 0)
var arr1,arr2 []int
for _,v := range arr{
mp[v]++
if v <0{
arr1 = append(arr1, v)
}else{
arr2 = append(arr2,v)
}
}
sort.Slice(arr1, func(i, j int) bool { return arr1[i]>arr1[j] })
sort.Ints(arr2)
arr1 = append(arr1,arr2...)
count := 0
for _,v := range arr1{
if mp[v] >0 && mp[2 * v] >0 {
if(v == 0 && mp[v]>=2) || v != 0{
count++
mp[v]--
mp[2 * v]--
}else{
mp[v]--
}
}
}
if count< len(arr)/2{
return false
}
return true
}
代码效率:
执行用时:96 ms, 在所有 Go 提交中击败了44.83%的用户
内存消耗:7.1 MB, 在所有 Go 提交中击败了68.97%的用户
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!