922.按奇偶排序数组II

#️ 922.按奇偶排序数组II

给定一个非负整数数组 nums, nums 中一半整数是 奇数 ,一半整数是 偶数 。

对数组进行排序,以便当 nums[i] 为奇数时,i 也是 奇数 ;当 nums[i] 为偶数时, i 也是 偶数 。

你可以返回 任何满足上述条件的数组作为答案 。

思路

基本思想

想法就是将奇数和偶数间接排列,偶奇偶奇偶奇偶奇这样的排列,所以需要将数组中的奇数和偶数分开来,第一想法就是遍历,遇到偶数就放到偶数位置,遇到奇数就放到奇数位置,所以需要两个下标,分别记录当前奇数和当前偶数的插入位置,一旦有插入就移动对应的下标

执行流程

  1. 遍历输入
  2. 遇到偶数元素就插入到偶数下标对应的位置,偶数下标移动两个位置
  3. 遇到奇数元素就插入到奇数下标对应的位置,奇数下标移动两个位置
  4. 返回最终的结果

代码

根据以上分析,得出以下代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution {
public:
    vector<int> sortArrayByParityII(vector<int>& nums) {
        //使用两个下标,一个奇数下标,一个偶数下标
        //遇到奇数插入后就奇数下标移动
        //遇到偶数插入后就偶数下标移动
        //这样可以做到一次遍历就得到最终的结果
        //不用再分开遍历
        int even=0,odd=1;
        vector<int> res(nums.size(),0);
        for(int i=0;i<nums.size();++i){
            if(nums[i]%2==0){//遇到了偶数
                res[even]=nums[i];
                even+=2;
            }else{//遇到了奇数
                res[odd]=nums[i];
                odd+=2;
            }
        }
        return res;
    }
};

总结

使用两个下标分开记录偶数和奇数的位置,避免了重复遍历,这样可以做到一次遍历就得到结果