Leetcode 954:二倍數對陣列(超詳細的解法!!!)
阿新 • • 發佈:2018-12-20
給定一個長度為偶數的整數陣列 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
提示:
0 <= A.length <= 30000
A.length
為偶數-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:
我將該問題的其他語言版本新增到了我的GitHub Leetcode
如有問題,希望大家指出!!!