LeetCode #954 Array of Doubled Pairs 二倍數對數組 954 Array of Doubled Pairs 二倍數對數組

954 Array of Doubled Pairs 二倍數對數組

Description:
Given an integer array of even length arr, return true if it is possible to reorder arr such that arr[2 * i + 1] = 2 * arr[2 * i] for every 0 <= i < len(arr) / 2, or false otherwise.

Example:

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: true
Explanation: 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:

2 <= arr.length <= 3 * 10^4
arr.length is even.
-10^5 <= arr[i] <= 10^5

題目描述:
給定一個長度爲偶數的整數數組 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 * 10^4
arr.length 是偶數
-10^5 <= arr[i] <= 10^5

思路:

排序
按照絕對值排序
用哈希表統計 arr 中元素的個數
每次查找是否有 2 * num 在哈希表中
然後將 num 及 2 * num 的計數都減少 1
時間複雜度爲 O(nlgn), 空間複雜度爲 O(n)

代碼:
C++:

class Solution 
{
public:
    bool canReorderDoubled(vector<int>& arr) 
    {
        unordered_map<int, int> m;
        sort(arr.begin(), arr.end(), [](int a, int b){ return abs(a) < abs(b); });
        for (const auto& num : arr) ++m[num];
        for (const auto& num : arr)
        {
            if (m[num])
            {
                if (m[num * 2] <= 0) return false;
                --m[num];
                --m[num * 2];
            }
        }
        return true;
    }
};

Java:

class Solution {
    public boolean canReorderDoubled(int[] arr) {
        Map<Integer, Integer> count = new HashMap<>();
        for (int num : arr) count.put(num, count.getOrDefault(num, 0) + 1);
        Integer[] nums = new Integer[arr.length];
        for (int i = 0, n = arr.length; i < n; i++) nums[i] = arr[i];
        Arrays.sort(nums, Comparator.comparingInt(Math::abs));
        for (int num : nums) {
            if (count.get(num) != 0) {
                if (count.getOrDefault(num << 1, 0) <= 0) return false;
                count.put(num, count.get(num) - 1);
                count.put(num << 1, count.get(num << 1) - 1);
            }
        }
        return true;
    }
}

Python:

class Solution:
    def canReorderDoubled(self, arr: List[int]) -> bool:
        arr.sort(key=abs)
        d = Counter(arr)
        for i in d:
            if d[i]:
                if (i << 1) in d:
                    d[i << 1] -= d[i]
                    if d[i << 1] < 0:
                        return False
                else:
                    return False
        return True
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章