题目地址:
https://www.lintcode.com/problem/interleaving-positive-and-negative-numbers/description
给定一个整数数组,要求将其重新排列,使得正负数交替出现。题目保证有解。
可以先将数组排序,这样就把正负数分开了。接着判断一下奇偶数哪个多,如果一样多,则可以按照负正负正的方式排列,如果奇数多,则也可以负正负正的方式排列,否则要按照正负正负的方式排列。根据不同情况用对撞双指针不停swap即可。代码如下:
import java.util.Arrays;
public class Solution {
/*
* @param A: An integer array.
* @return: nothing
*/
public void rerange(int[] A) {
// write your code here
if (A == null || A.length < 3) {
return;
}
Arrays.sort(A);
int l = 0, r = A.length - 1;
if (A.length % 2 == 0) {
l++;
r--;
} else {
int mid = A[A.length / 2];
if (mid > 0) {
r--;
} else {
l++;
}
}
while (l < r) {
swap(A, l, r);
l += 2;
r -= 2;
}
}
private void swap(int[] A, int i, int j) {
int tmp = A[i];
A[i] = A[j];
A[j] = tmp;
}
}
时间复杂度 O ( n log n ) O(n\log n) O(nlogn),空间 O ( 1 ) O(1) O(1)。