Array of Doubled Pairs

LeetCode Q 954 - Array of Doubled Pairs

Given an array of integers A with even length, return true if and only if it is possible to reorder it such that A[2 * i + 1] = 2 * A[2 * i] for every 0 <= i < len(A) / 2.

Example 1: Input: [3,1,3,6] ; Output: false
Example 2: Input: [2,1,2,6] ; Output: false
Example 3: Input: [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: [1,2,4,16,8,4] ; Output: false

Note:

  • 0 <= A.length <= 30000
  • A.length is even
  • -100000 <= A[i] <= 100000

Solution

Solution 1 : Using Array

Code:

public boolean canReorderDoubled(int[] A) {
  if (A.length == 0) return true;

  int[] counts = new int[100001];

  for (int a: A) {
    if (a < 0) counts[-a]++;
    else counts[a]++;
  }

  for (int i = 0; i < 100001; i++) {
    if (counts[i] == 0) continue;
    if (i > 100001 / 2) return false;
    if (counts[i] > counts[i * 2]) return false;
    counts[i * 2] -= counts[i]; 
  }

  return true;
}

Solution 2 : Using TreeMap

Code:

public boolean canReorderDoubled(int[] A) {
  if (A.length == 0) return true;

  Map<Integer, Integer> map = new TreeMap<>();

  for (int a: A) {
    if (a < 0) map.put(-a, map.getOrDefault(-a, 0) + 1);
    else map.put(a, map.getOrDefault(a, 0) + 1);
  }

  for (int i = 0; i < 100001; i++) {
    if (counts[i] == 0) continue;
    
    if (map.get(i) > map.getOrDefault(2 * i, 0)) return false;

    map.put(2 * i, map.get(2 * i) - map.get(i));
  }

  return true;
}

   Reprint policy


《Array of Doubled Pairs》 by Tong Shi is licensed under a Creative Commons Attribution 4.0 International License
  TOC