954. Array of Doubled Pairs
leetcode medium
#array#csharp#hash-table#leetcode#math#medium#sort
Task
Если задан целочисленный массив четной длины arr, верните true, если можно переупорядочить arr так, чтобы arr[2 * i + 1] = 2 * arr[2 * i] для каждого 0 <= i < len(arr) / 2, или false в противном случае.
Пример:
Input: arr = [3,1,3,6]
Output: false
C# solution
matched/originalusing System;
using System.Collections.Generic;
public class Solution {
public bool CanReorderDoubled(int[] arr) {
Dictionary<int, int> count = new Dictionary<int, int>();
foreach (int num in arr) {
if (count.ContainsKey(num)) {
count[num]++;
} else {
count[num] = 1;
}
}
Array.Sort(arr, (a, b) => Math.Abs(a).CompareTo(Math.Abs(b)));
foreach (int num in arr) {
if (count[num] == 0) continue;
if (!count.ContainsKey(2 * num) || count[2 * num] == 0) return false;
count[num]--;
count[2 * num]--;
}
return true;
}
}C++ solution
auto-draft, review before submit#include <bits/stdc++.h>
using namespace std;
// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
class Solution {
public:
public bool CanReorderDoubled(vector<int>& arr) {
unordered_map<int, int> count = new unordered_map<int, int>();
foreach (int num in arr) {
if (count.count(num)) {
count[num]++;
} else {
count[num] = 1;
}
}
Array.Sort(arr, (a, b) => abs(a).CompareTo(abs(b)));
foreach (int num in arr) {
if (count[num] == 0) continue;
if (!count.count(2 * num) || count[2 * num] == 0) return false;
count[num]--;
count[2 * num]--;
}
return true;
}
}Java solution
auto-draft, review before submitimport java.util.*;
import java.math.*;
// Auto-generated Java draft from the C# solution. Review API differences before LeetCode submit.
public class Solution {
public boolean CanReorderDoubled(int[] arr) {
HashMap<int, int> count = new HashMap<int, int>();
foreach (int num in arr) {
if (count.containsKey(num)) {
count[num]++;
} else {
count[num] = 1;
}
}
Array.Sort(arr, (a, b) => Math.abs(a).CompareTo(Math.abs(b)));
foreach (int num in arr) {
if (count[num] == 0) continue;
if (!count.containsKey(2 * num) || count[2 * num] == 0) return false;
count[num]--;
count[2 * num]--;
}
return true;
}
}JavaScript solution
matched/originalvar canReorderDoubled = function(arr) {
let count = new Map();
for (let num of arr) {
count.set(num, (count.get(num) || 0) + 1);
}
arr.sort((a, b) => Math.abs(a) - Math.abs(b));
for (let num of arr) {
if (count.get(num) === 0) continue;
if (count.get(num * 2) === 0) return false;
count.set(num, count.get(num) - 1);
count.set(num * 2, count.get(num * 2) - 1);
}
return true;
};Go solution
matched/originalpackage main
import (
"sort"
)
func canReorderDoubled(arr []int) bool {
count := make(map[int]int)
for _, num := range arr {
count[num]++
}
sort.Slice(arr, func(i, j int) bool {
return abs(arr[i]) < abs(arr[j])
})
for _, num := range arr {
if count[num] == 0 {
continue
}
if count[2*num] == 0 {
return false
}
count[num]--
count[2*num]--
}
return true
}
func abs(x int) int {
if x < 0 {
return -x
}
return x
}Explanation
Algorithm
Подсчитать частоту каждого элемента в массиве.
Отсортировать массив по абсолютным значениям элементов.
Для каждого элемента в отсортированном массиве:
Проверить, можно ли сопоставить его с элементом, равным его удвоенному значению.
Уменьшить счетчик обоих элементов в словаре частот.
Если для каждого элемента можно найти пару, вернуть true, иначе вернуть false.
😎