[LintCode] Interleaving Positive and Negative Numbers

Given an array with positive and negative integers. Re-range it to interleaving with positive and negative integers.

Example

Given [-1, -2, -3, 4, 5, 6], after re-range, it will be[-1, 5, -2, 4, -3, 6] or any other reasonable answer.

Note

You are not necessary to keep the original order of positive integers or negative integers.

Challenge

Do it in-place and without extra memory.

 

class Solution {
public:
    /**
     * @param A: An integer array.
     * @return: void
     */
     void rerange(vector<int> &A) {
       int n = A.size();
       if(n < 3) return;
       
       int posNum = 0, negNum = 0, posIdx = 0, negIdx = 1;
       for(size_t t = 0;t < n;++t){
           if(A[t] >= 0) ++posNum;
           else ++negNum;
       }
       
       if(negNum > posNum){
           negIdx = 0;
           posIdx = 1;
       }
       
       while(posIdx < n && negIdx < n){
           while(posIdx < n && A[posIdx] >= 0) posIdx += 2;
           while(negIdx < n && A[negIdx] < 0) negIdx += 2;
           if(posIdx < n && negIdx < n) swap(A[posIdx],A[negIdx]);
       }
   }
  
};

 

posted @ 2015-09-09 09:42  xchangcheng  阅读(187)  评论(0编辑  收藏  举报