题目

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

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

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

示例 1:

  1. 输入:nums = [4,2,5,7]
  2. 输出:[4,5,2,7]
  3. 解释:[4,7,2,5],[2,5,4,7],[2,7,4,5] 也会被接受。

示例 2:

  1. 输入:nums = [2,3]
  2. 输出:[2,3]

提示:

  • 2 <= nums.length <= 2 * 10^4
  • nums.length 是偶数
  • nums 中一半是偶数
  • 0 <= nums[i] <= 1000

进阶:可以不使用额外空间解决问题吗?

解题方法

构造数组

构造额外数组,遍历原数组,分别将奇数和偶数按顺序填在奇数位和偶数位。
时间复杂度O(n),空间复杂度O(n)
C++代码:

  1. class Solution {
  2. public:
  3. vector<int> sortArrayByParityII(vector<int>& nums) {
  4. vector<int> result(nums.size(), 0);
  5. int oddidx = 0;
  6. int evenidx = 1;
  7. for(int num : nums) {
  8. if(num%2==0) {
  9. result[oddidx] = num;
  10. oddidx += 2;
  11. }
  12. else {
  13. result[evenidx] = num;
  14. evenidx += 2;
  15. }
  16. }
  17. return result;
  18. }
  19. };

双指针

双指针分别遍历奇数位和偶数位,当在偶数位遇到奇数时与奇数位遇到的第一个偶数交换。
时间复杂度O(n),空间复杂度O(1)
C++代码:

  1. class Solution {
  2. public:
  3. vector<int> sortArrayByParityII(vector<int>& nums) {
  4. int idx = 1;
  5. for(int i=0; i<nums.size(); i+=2) {
  6. if(nums[i]%2) {
  7. while(nums[idx]%2 != 0) idx += 2;
  8. swap(nums[idx], nums[i]);
  9. }
  10. }
  11. return nums;
  12. }
  13. };