954. Array of Doubled Pairs

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

  • 0 <= arr.length <= 3 * 104
  • arr.length is even.
  • -105 <= arr[i] <= 105

Rust Solution

struct Solution;
use std::cmp::Ordering::*;

impl Solution {
    fn can_reorder_doubled(a: Vec<i32>) -> bool {
        let mut nonzero: Vec<Vec<i32>> = vec![vec![]; 2];
        let mut zero: usize = 0;
        for x in a {
            match x.cmp(&0) {
                Equal => {
                    zero += 1;
                }
                Less => {
                    nonzero[0].push(-x);
                }
                Greater => {
                    nonzero[1].push(x);
                }
            }
        }
        if zero % 2 != 0 || nonzero[0].len() % 2 != 0 || nonzero[1].len() % 2 != 0 {
            return false;
        }
        for i in 0..2 {
            nonzero[i].sort_unstable();
            let size = nonzero[i].len();
            let mut fast = 0;
            for slow in 0..size {
                if nonzero[i][slow] == 0 {
                    continue;
                } else {
                    while fast < size && nonzero[i][fast] != 2 * nonzero[i][slow] {
                        fast += 1;
                    }
                    if fast == size {
                        return false;
                    } else {
                        nonzero[i][fast] = 0;
                    }
                }
            }
        }
        true
    }
}

#[test]
fn test() {
    let a = vec![3, 1, 3, 6];
    let res = false;
    assert_eq!(Solution::can_reorder_doubled(a), res);
    let a = vec![2, 1, 2, 6];
    let res = false;
    assert_eq!(Solution::can_reorder_doubled(a), res);
    let a = vec![4, -2, 2, -4];
    let res = true;
    assert_eq!(Solution::can_reorder_doubled(a), res);
    let a = vec![1, 2, 4, 16, 8, 4];
    let res = false;
    assert_eq!(Solution::can_reorder_doubled(a), res);
    let a = vec![1, 2, 1, -8, 8, -4, 4, -4, 2, -2];
    let res = true;
    assert_eq!(Solution::can_reorder_doubled(a), res);
}

Having problems with this solution? Click here to submit an issue on github.