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

  1. 0 <= A.length <= 30000
  2. A.length is even
  3. -100000 <= A[i] <= 100000

Runtime: 84 ms, faster than 81.90% of C++ online submissions for Array of Doubled Pairs.

挺简单的一道median,但是要注意一些细节,

1. 0 ,正数,负数,分开考虑。

2. 去重前需要排序。

#define ALL(x) (x).begin(),(x).end()
#include <vector>
#include <unordered_map>
#include <algorithm>
using namespace std;

class Solution {
public:
  bool canReorderDoubled(vector<int>& A) {
    vector<int> positive;
    vector<int> negative;
    int zerocnt = 0;
    for(auto x : A) {
      if(x == 0) zerocnt++;
    }
    if(zerocnt&1 == 1) return false;
    for(auto x : A) {
      if(x > 0) positive.push_back(x);
      else negative.push_back(-x);
    }
    return helper(positive) && helper(negative);
  }
  bool helper(vector<int>& A) {
    unordered_map<int,int> map;
    for(auto x : A) map[x]++;
    vector<int> idA;
    sort(ALL(A));
    for(int i=0; i<A.size(); i++){
      if(i == 0 || idA.back() != A[i]) idA.push_back(A[i]); 
    }
    //reverse(ALL(idA));
    //for(auto x : idA) cout << x << endl;
    for(auto x : idA) {
      //cout << x << endl;
      if(map[x] == 0) continue;
      if(!map.count(x<<1) || map[x<<1] < map[x]) return false;
      
      map[x<<1] -= map[x];
      //map[x] = 0;
    }
    return true;
  }
};

猜你喜欢

转载自www.cnblogs.com/ethanhong/p/10177221.html
今日推荐