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