首尾双指针
题目链接:https://leetcode.cn/problems/diao-zheng-shu-zu-shun-xu-shi-qi-shu-wei-yu-ou-shu-qian-mian-lcof/
调整数组中奇数偶数元素的位置,我们可以想到双指针,左指针从左向右查找偶数,右指针从右向左查找奇数,然后交换。这个思想跟快排的思想一样,一个从左边查找比key(一般选数组左边的值)大的,右边找比key值小的,交换完后,数组就是有序的。
动图演示:
代码如下:
class Solution {
public:
vector<int> exchange(vector<int>& nums) {
int i = 0, j = nums.size()-1;
while(i < j){
while(i < j && nums[i] % 2 == 1) i++;
while(i < j && nums[j] % 2 == 0) j--;
swap(nums[i],nums[j]);
}
return nums;
}
};
时间复杂度:O(n)
空间复杂度:O(1)
快慢双指针
还可以用快慢指针来做,fast和slow都从数组的首部开始,fast向后查找奇数,若遇到奇数就和slow互换,直到数组遍历完。
动图演示:
代码如下:
class Solution {
public:
vector<int> exchange(vector<int>& nums) {
int slow = 0,fast = 0;
while(fast < nums.size()){
if(nums[fast] % 2 == 1){
swap(nums[fast],nums[slow++]);
}
fast++;
}
return nums;
}
};
时间复杂度:O(n)
空间复杂度:O(1)