[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]); } } };