leetcode_954 二倍数对数组

72 阅读1分钟

要求

给定一个长度为偶数的整数数组 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]

示例 4:

输入:arr = [1,2,4,16,8,4]
输出:false

提示:

  • 0 <= arr.length <= 3 * 104
  • arr.length 是偶数
  • -105 <= arr[i] <= 105

核心代码

class Solution:
    def canReorderDoubled(self, arr: List[int]) -> bool:
        a_dict = Counter(arr)
        for x in sorted(a_dict,key=lambda x:abs(x)):
            if a_dict[x] > a_dict[2 * x]:
                return False
            a_dict[2 * x] -= a_dict[x]
        return True 

image.png

解题思路:我们对数字进行统计,统计完成我们对齐进行排序,如果x的个数大于2x的个数 必定有x无法和2x匹配,返回Flase,更新2x的个数=(2x-x)的个数 直到2x个数为0 才返回true。