前言
数组题目练习。
练习题八 【922. 按奇偶排序数组II】
一、题目阅读
给定一个非负整数数组 nums, nums 中一半整数是 奇数 ,一半整数是 偶数 。
对数组进行排序,以便当 nums[i] 为奇数时,i 也是 奇数 ;当 nums[i] 为偶数时, i 也是 偶数 。
你可以返回 任何满足上述条件的数组作为答案 。
示例 1:
输入:nums = [4,2,5,7]
输出:[4,5,2,7]
解释:[4,7,2,5],[2,5,4,7],[2,7,4,5] 也会被接受。
示例 2:
输入:nums = [2,3]
输出:[2,3]
提示:
2 <= nums.length <= 2 * 104
nums.length 是偶数
nums 中一半是偶数
0 <= nums[i] <= 1000
进阶:可以不使用额外空间解决问题吗?
二、尝试实现
思路
- 理解题目:长度肯定是偶数,因为说nums内元素一半奇数,一半偶数。说明如果i为奇数,nums[i]是偶数,肯定有个地方j是偶数,nums[j]是奇数。所以这成对出现,就可以在原数组里面找到交换的对象。给了在原数组上操作思路。
- i只指向奇数下标,如果nums[i]也是奇数,i +=2k;继续往下。
- i只指向奇数下标,如果nums[i]是偶数。用j指向偶数下标,while循环找nums[j]是奇数。找到之后交换。
代码实现
cpp
class Solution {
public:
vector<int> sortArrayByParityII(vector<int>& nums) {
int j=0;
for(int i = 1 ;i < nums.size();i +=2){
if(nums[i]%2 == 0){
while(j < nums.size() && (nums[j]%2 == 0)){
j += 2;
}
swap(nums[i],nums[j]);
}
}
return nums;
}
};
三、参考答案
学习内容
给了三种方法:
第三种方法最简洁和尝试实现中的思路一致,只不过奇偶换一下。思路里的成对出现,很能够简单解决,也不用额外记录谁换过谁没换过。
总结
如果一个奇数位对应偶数,那么肯定一个偶数位对应奇数。
(欢迎指正,转载标明出处)