動機
- 乖乖sort
- 用到整數除法注意奇數
Problem
Given an array of integers arr of even length, return true if and only if it is possible to reorder it such that arr[2 * i + 1] = 2 * arr[2 * i] for every 0 <= i < len(arr) / 2.
Example 1:
Input: arr = [3,1,3,6]Output: false
Example 2:
Input: arr = [2,1,2,6]Output: false
Example 3:
Input: arr = [4,-2,2,-4]Output: trueExplanation: We can take two groups, [-2,-4] and [2,4] to form [-2,-4,2,4] or [2,4,-2,-4].
Example 4:
Input: arr = [1,2,4,16,8,4]Output: false
Constraints:
- 0 <= arr.length <= 3 * 104
- arr.lengthis even.
- -105 <= arr[i] <= 105
Sol
class Solution:
    def canReorderDoubled(self, arr: List[int]) -> bool:
        cnts = Counter(arr)
        
        ks = sorted(list(cnts.keys()))
        for k in ks:
            for _ in range(cnts[k]):
                for n in ([k*2,k//2] if k % 2 == 0 else [k*2]):
                    if n in cnts:
                        if cnts[n] == 1:
                            del cnts[n]
                        else:
                            cnts[n] -= 1
                        if cnts[k] == 1:
                            del cnts[k]
                        else:
                            cnts[k] -= 1
        return not cnts