1. 程式人生 > >Leetcode 954:二倍數對陣列(超詳細的解法!!!)

Leetcode 954:二倍數對陣列(超詳細的解法!!!)

給定一個長度為偶數的整數陣列 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

如有問題,希望大家指出!!!