905.按奇偶排序数组
Posted hehesunshine
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了905.按奇偶排序数组相关的知识,希望对你有一定的参考价值。
1、题目
给定一个非负整数数组 A,返回一个数组,在该数组中, A 的所有偶数元素之后跟着所有奇数元素。
你可以返回满足此条件的任何数组作为答案。
示例:
输入:[3,1,2,4]
输出:[2,4,3,1]
输出 [4,2,3,1],[2,4,1,3] 和 [4,2,1,3] 也会被接受。
输出:[2,4,3,1]
输出 [4,2,3,1],[2,4,1,3] 和 [4,2,1,3] 也会被接受。
2、思路
思路1:找出最大值;申请大小位max+1的vector;A[j]==i,则vector对应i位置加1;释放A,根据vector中的数
值重新存进A中;
思路2:申请两个vector,一个全部装偶数,一个全部装奇数,然后拼接两个vector
思路3:双指针法:遍历数组A;偶数从头开始存放,奇数从尾部开始存放;当j-i==0时候停止,本文选思路3
因为思路3只用申请一个辅助空间,遍历一次
值重新存进A中;
思路2:申请两个vector,一个全部装偶数,一个全部装奇数,然后拼接两个vector
思路3:双指针法:遍历数组A;偶数从头开始存放,奇数从尾部开始存放;当j-i==0时候停止,本文选思路3
因为思路3只用申请一个辅助空间,遍历一次
思路4:对思路3的改进,不用申请辅助空间,双指针双向遍历,i是交换位,j位是比较位,判断i是不是偶数,是偶数,i+1,不是偶数j+1,判断j是不是偶数,不是j再+1,知道j指向偶数位置,然后交换i和j的值,直至j指向数组尾部。
3、代码
思路3:
1 //记得自己好像做过这道题 2 //思路1:找出最大值;申请大小位max+1的vector;A[j]==i,则vector对应i位置加1;释放A,根据vector中的数 3 //值重新存进A中; 4 //思路2:申请两个vector,一个全部装偶数,一个全部装奇数,然后拼接两个vector 5 //思路3:双指针法:遍历数组A;偶数从头开始存放,奇数从尾部开始存放;当j-i==0时候停止,本文选思路3 6 //因为思路3只用申请一个辅助空间,遍历一次 7 class Solution { 8 public: 9 vector<int> sortArrayByParity(vector<int>& A) { 10 vector<int>a(A.size()); 11 int i=0; 12 int j=A.size()-1;//定义i和j双指针 13 int k=0; 14 while(j-i>=0){ 15 if(A[k]%2==0) { 16 a[i]=A[k]; 17 i=i+1; 18 } 19 else{ 20 a[j]=A[k]; 21 j--; 22 } 23 k++; 24 } 25 return a; 26 } 27 };
思路四:
1 class Solution { 2 public: 3 vector<int> sortArrayByParity(vector<int>& A) { 4 int i=0,j=0; 5 int le=A.size(); 6 while(i<le&&j<le) 7 { 8 if(A[j]%2==0) {swap(A[i],A[j]);i++;j++;} 9 else j++; 10 } 11 return A; 12 13 } 14 };
发现运行起来,思路更慢!!还不如思路3!!
以上是关于905.按奇偶排序数组的主要内容,如果未能解决你的问题,请参考以下文章