按奇偶排序数组I-II

举报
芒果_Mango 发表于 2022/11/30 23:57:08 2022/11/30
【摘要】 905. 按奇偶排序数组https://leetcode.cn/problems/sort-array-by-parity/方法:首尾指针left和right, 最初:left指向最左,right指向最右left不断往右走:要防止越界(left<right),找奇数right不断往左走:要防止越界(left<right),找偶数找到之后,交换left和right位置的元素nums[left...

905. 按奇偶排序数组

https://leetcode.cn/problems/sort-array-by-parity/

image-20220602171833961

方法:首尾指针left和right, 最初:left指向最左,right指向最右

  • left不断往右走:要防止越界(left<right),找奇数
  • right不断往左走:要防止越界(left<right),找偶数
  • 找到之后,交换left和right位置的元素

nums[left]&1 == 0 ->err ==的优先级比&高

class Solution {
public:
    vector<int> sortArrayByParity(vector<int>& nums) {
        int left = 0;
        int right = nums.size()-1;
        //当left和right指同一个数不处理!
        while(left <right)
        {
            //左指针找奇数
            while(left < right && (nums[left]&1) == 0)
            {
                left++;
            }
            //右指针找偶数
            while(left < right && (nums[right]&1) !=0)
            {
                right--;
            }
            //交换的时候要防止越界!因为上面跳出来可能是越界跳出来的
            if(left < right)
            {
                swap(nums[left],nums[right]);
                //交换之后,left和right往后/往前走,否则会导致死循环
                left++;
                right--;
                //简写:
               //swap(nums[left++],nums[right--])
            }
        }
        return nums;
    }
};

922. 按奇偶排序数组 II

https://leetcode.cn/problems/sort-array-by-parity-ii/

image-20220602173603390

方法1:准备一个临时数组,遍历两次原数组,第一次把奇数拷贝到临时数组的奇数位 第二次把偶数拷贝到临时数组的偶数位

class Solution {
public:
    vector<int> sortArrayByParityII(vector<int>& nums) {
        int n = nums.size();
        vector<int> ans;
        ans.resize(n,0);//记得开辟同样大小的空间!!!初始化为0
        int i = 0;
        //遍历放偶数到ans[0],ans[2]...位置
        for(auto x:nums)
        {
            //偶数
            if(x%2 == 0)  // x&1 == 0
            {
                ans[i] = x;
                i+=2;//放到偶数位上
            }
        }
        //再次遍历放奇数
        i= 1;
        for(auto x:nums)
        {
            //奇数
            if(x%2 != 0)
            {
                ans[i] = x;
                i+=2;//放到奇数位上
            }
        }
        return ans;
    }
};

方法2:双指针 在偶数位上找奇数,在奇数位上找偶数,找到后将它们交换即可

  • 注意优先级的问题!!! nums[i]&1 == 0 ->err ==的优先级比&高
class Solution {
public:
    vector<int> sortArrayByParityII(vector<int>& nums) {
        //前后指针
        //i:初始化为0,在偶数位上找奇数
        //j:初始化为1,在奇数位上找偶数
        //找到之后,停下来,然后交换二者的值
        int i = 0;
        int j = 1;
        while(i<nums.size() && j<nums.size())
        {
            //i在偶数位上找奇数
            while(i<nums.size() && (nums[i]&1) == 0)
            {
                i+=2;
            }
            //j在奇数位上找偶数
            while(j<nums.size()&&(nums[j]&1) != 0)
            {
                j+=2;
            }
            //来到这里,就交换此时二者指向的值,注意要防止越界!
            if(i<nums.size() && j<nums.size())
            {
                swap(nums[i],nums[j]);
            }
            //交换完之后,二者都要往后走到下一个奇数位/偶数位
            //否则就会导致死循环
            i+=2;
            j+=2;
        }
        return nums;
    }
};

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。