🔥题目
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。
输入:[1, 2, 3, 4, 8, 9]
输出:[1, 3, 9, 2, 4, 8]
补充:[1, 9, 3, 2, 8, 4] …
☘️解析
我们不希望使用额外空间(那样当然更加简单),所以要考虑原地算法。
再审视一遍题目要求:把所有奇数移到前面,把所有偶数移到后面,但奇数部分和偶数部分内部不考虑顺序…
这是不是和单次快速排序的思想极为相似:把所有小于基准的数移到前面,把所有大于基准的数移到后面,但在两部分的内部都不考虑顺序…
看看下面的代码,你会恍然大悟!
🧊代码
class Solution {
public int[] exchange(int[] nums) {
if (nums.length == 0) {
return nums;
}
int left = 0;
int right = nums.length - 1;
int temp = nums[left];
while (left < right) {
while (left < right && (nums[right] & 1) == 0) {
right--;
}
nums[left] = nums[right];
while (left < right && (nums[left] & 1) == 1) {
left++;
}
nums[right] = nums[left];
}
nums[left] = temp;
return nums;
}
}
🌸补充
最后总结一下快速排序思想的使用场景:将数据按某个特征分为两部分,一部分在前,一部分在后,但在这两部分的内部不考虑顺序。