力扣经典题目之922. 按奇偶排序数组 II

今天继续给大家分享一道力扣的做题心得今天这道题目是922. 按奇偶排序数组 II

题目如下:


1,题目分析

这道题目看上去很简单,但是要高效的完成此题目,还需要使用比较巧妙一点的办法,因为此题目需要返回一个奇数偶数和数组排序的序号相对应的数组。

此题目我首先使用了最简单粗暴的解题方法,就是利用arraylist,创建两个数组分别存储奇数和偶数,然后安照奇数偶数的顺序来重新拼接起数组。

然后有两个比较好的巧妙一些的解题方法是

1,两次遍历,首先先遍历一遍数组把所有的偶数放进 ans[0],ans[2],ans[4],以此类推。

再遍历一遍数组把所有的奇数依次放进 ans[1],ans[3],ans[5],以此类推。

2,双指针

如果原数组可以修改,则可以使用就地算法求解。

为数组的偶数下标部分和奇数下标部分分别维护指针 i,j。随后,在每一步中,如果 nums[i] 为奇数,则不断地向前移动 j(每次移动两个单位),直到遇见下一个偶数。此时,可以直接将 nums[i] 与 nums[j] 交换。我们不断进行这样的过程,最终能够将所有的整数放在正确的位置上。

2,解题思路

// 直接暴力解法
class Solution {
    public int[] sortArrayByParityII(int[] nums) {
        int length = nums.length;
        List<Integer> ouarray = new ArrayList<>();
        List<Integer> qiarray = new ArrayList<>();
        List<Integer> result = new ArrayList<>();

        for(int x : nums){
            if(x%2 == 0){
                ouarray.add(x);
            }else{
                qiarray.add(x);
            }
        }

        int i = 0;int j = 0;
        for(int y = 0;y < length;y++){
            if(y%2 == 0){
                result.add(ouarray.get(i));
                i++;
            }else{
                result.add(qiarray.get(j));
                j++;
            }
        }
        int[] newresult = new int[result.size()];
        for(int x=0;x<result.size();x++){
            newresult[x] =result.get(x); 
        }

        return newresult;
        
    }
}
// 两次遍历法
class Solution {
    public int[] sortArrayByParityII(int[] nums) {
        int n = nums.length;
        int[] ans = new int[n];

        int i = 0;
        for (int x : nums) {
            if (x % 2 == 0) {
                ans[i] = x;
                i += 2;
            }
        }
        i = 1;
        for (int x : nums) {
            if (x % 2 == 1) {
                ans[i] = x;
                i += 2;
            }
        }
        return ans;
    }
}
// 双指针法
class Solution {
public:
    vector<int> sortArrayByParityII(vector<int>& nums) {
        int n = nums.size();
        int j = 1;
        for (int i = 0; i < n; i += 2) {
            if (nums[i] % 2 == 1) {
                while (nums[j] % 2 == 1) {
                    j += 2;
                }
                swap(nums[i], nums[j]);
            }
        }   
        return nums;
    }
};

4,总结

        感谢大家的阅读,希望这篇解题心得能为大家带来一些收获,我们共同进步!大家的点赞就是我的动力谢谢大家,还有什么更优解或者问题欢迎大家在评论区讨论分享!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值