今天继续给大家分享一道力扣的做题心得今天这道题目是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,总结
感谢大家的阅读,希望这篇解题心得能为大家带来一些收获,我们共同进步!大家的点赞就是我的动力谢谢大家,还有什么更优解或者问题欢迎大家在评论区讨论分享!