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.Challenge
Do it in-place and without extra memory.
Notice
You are not necessary to keep the original order of positive integers or negative integers.
public class Solution {
/*
* @param A: An integer array.
* @return: nothing
*/
public void rerange(int[] A) {
if (A == null || A.length < 2) {
return;
}
int pivot = partition(A);
int numNegative = pivot + 1;
int numPositive = A.length - pivot - 1;
if (numNegative == numPositive - 1) {
interleave(A, 0, A.length - 2);
} else if (numNegative == numPositive + 1 ) {
interleave(A, 1, A.length - 1);
} else {
interleave(A, 0, A.length - 1);
}
}
private int partition(int[] A) {
int start = 0;
int end = A.length - 1;
while (start <= end) {
while (start <= end && A[start] < 0) {
start++;
}
while (start <= end && A[end] >= 0) {
end--;
}
if (start <= end) {
swap(A, start, end);
start++;
end--;
}
}
return end;
}
private void interleave(int[] A, int start, int end) {
while (start < end) {
swap(A, start, end);
start += 2;
end -= 2;
}
}
private void swap(int[] A, int i, int j) {
int temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
No comments:
Post a Comment