思路1:根据双指针对撞指针的思路,定义一个左指针从数组前端开始遍历,定义一个右指针从后端开始遍历,这时候有四种情况
- 左奇右偶:这种情况需要将其位置交换,将偶数提前,奇数后移
- 左奇右奇:这种情况需要右指针遍历下一个
- 左偶右偶:这种情况需要左指针遍历下一个
- 左偶右奇:这种情况需要左指针和右指针分别遍历下一下
当左指针遇到右指针时排序完成
class Solution {
public int[] sortArrayByParity(int[] nums) {
int left = 0;
int right = nums.length - 1;
while(left < right){
if(nums[left] % 2 == 0 && nums[right] % 2 == 0){
left++;
}else if(nums[left] % 2 == 0 && nums[right] % 2 == 1){
left++;
right--;
}else if(nums[left] % 2 == 1 && nums[right] % 2 == 1){
right--;
}else{
int temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
}
}
return nums;
}
}
思路二:优化解法,定义一个指针(下标)从头开始遍历,定义一个指针(下标)指向数组最后一个数,当左指针遇见奇数则将其与右指针指向的数做交换,右指针自减,左指针不变,这样右指针右边的数一定是奇数;继续判断左指针指向的数是否为奇数,若为奇数,则与右指针指向的数做交换,右指针再次自减,有点类似于滑动窗口,右指针右边的数全为奇数;若左指针为偶数,则左指针自加,右指针不变
当左指针与右指针相撞时,遍历结束
举例
1 4 7 3 2 9 5 8 红色加粗数字即现在左指针所指的数字,黑色加粗数字即为右指针指向的数字,左指针现在指向的数为奇数,交换左右指针的数字,并右指针自减,左指针不变
8 4 7 3 2 9 5 1 左指针所指为偶数,左指针自加,右指针不变
8 4 7 3 2 9 5 1
8 4 7 3 2 9 5 1
8 4 5 3 2 9 7 1
8 4 9 3 2 5 7 1
8 4 2 3 9 5 7 1
8 4 2 3 9 5 7 1 当这时左指针和右指针相撞,遍历结束,排序也结束
Java实现:
class Solution {
public int[] sortArrayByParity(int[] nums) {
int tempEnd = nums.length - 1;
for(int i = 0;i < tempEnd;i++){
if(nums[i] % 2 == 1){
int temp = nums[i];
nums[i--] = nums[tempEnd];
nums[tempEnd--] = temp;
}
}
return nums;
}
}