剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
仅供自己学习
思路:
新建一个数组,用left和right两个指针,判断nums[i]是否为偶,如果是就res[right]=nums[i],否则从left位置加。
代码:
class Solution {
public:
vector<int> exchange(vector<int>& nums) {
vector<int> res(nums.size());
int left=0,right=nums.size()-1;
for(int i=0;i<nums.size();++i){
if((nums[i]&1)==0) res[right--]=nums[i];
else res[left++]=nums[i];
}
return res;
}
};
时间复杂度O(n),空间复杂度O(n)
另一种方法为原地算法。同样left和right指针,判断left和right指的是否为奇偶,如果left为奇数那么就+1,如果right为偶数就-1,如果left为偶,right为奇,那么就交换。
class Solution {
public:
vector<int> exchange(vector<int>& nums) {
int left=0,right=nums.size()-1;
while(left<right){
if((nums[left]&1)==1){
left++;
continue;
}
if((nums[right]&1)==0){
right--;
continue;
}
swap(nums[left++],nums[right--]);
}
return nums;
}
};
这里不加continue会报错,如[1,2],第一次会进入循环,然后left会指向2,如果不continue,那么接着right就会指向1,然后1和2交换。如果continue就直接返回【1,2】了。
空间复杂度就为O(1)