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、思路
思路1:找出最大值;申请大小位max+1的vector;A[j]==i,则vector对应i位置加1;释放A,根据vector中的数
值重新存进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!!

 
原文地址:https://www.cnblogs.com/hehesunshine/p/11722862.html