剑指 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)

posted @ 2021-04-04 23:47  Mrsdwang  阅读(37)  评论(0编辑  收藏  举报