Leetcode 954:二倍数对数组(超详细的解法!!!)

版权声明:本文为博主原创文章,未经博主允许不得转载。有事联系:[email protected] https://blog.csdn.net/qq_17550379/article/details/85051342

给定一个长度为偶数的整数数组 A,只有对 A 进行重组后可以满足 “对于每个 0 <= i < len(A) / 2,都有 A[2 * i + 1] = 2 * A[2 * i]” 时,返回 true;否则,返回 false

示例 1:

输入:[3,1,3,6]
输出:false

示例 2:

输入:[2,1,2,6]
输出:false

示例 3:

输入:[4,-2,2,-4]
输出:true
解释:我们可以用 [-2,-4] 和 [2,4] 这两组组成 [-2,-4,2,4] 或是 [2,4,-2,-4]

示例 4:

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

提示:

  1. 0 <= A.length <= 30000
  2. A.length 为偶数
  3. -100000 <= A[i] <= 100000

解题思路

我们首先统计输入数组中所有元素出现的次数。

将统计后的字典按照key的绝对值排序。

此时我们只要判断字典中的当前数字的个数dict[i]是不是大于dict[2*i],如果是的话,那么显然不能构成二倍数对数组,如果不是的话,我们更新dict[2*i] -= dict[i]。为什么呢?因为可能出现这种情况{1:1, 2:2, 4:1}

from collections import Counter
class Solution:
    def canReorderDoubled(self, A):
        """
        :type A: List[int]
        :rtype: bool
        """
        A_dict = Counter(A)
        
        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  

reference:

https://leetcode.com/problems/array-of-doubled-pairs/discuss/203183/JavaC++Python-Match-from-the-Smallest-or-Biggest-100

我将该问题的其他语言版本添加到了我的GitHub Leetcode

如有问题,希望大家指出!!!

猜你喜欢

转载自blog.csdn.net/qq_17550379/article/details/85051342
今日推荐