905. Sort Array By Parity(easy)


题目理解:
一个数组中全是非负数,现在要我们把偶数放在前面,奇数放在偶数之后

首先想到的做法:声明一个新的vector,扫描A两遍,第一遍插入偶数,第二遍插入奇数,返回新的vector
可能优化方向:

  • 扫描一遍
  • 不分配新空间

于是想到了新的做法:用两个指针标记位置,两个指针分别从前往后和从后往前扫描
比较两个指针所指的数据有4种情况:

情况对应操作
前奇后偶交换位置,i向后移,j向前移
前偶后奇不用交换,i往后移,j往前移
前后全是偶数不用交换,i往后移
前后全是奇数不用交换,j往前移

其实这种做法的本质就是利用两个指针在O(N)时间里达到了和之前扫描两次同样的效果,并且维护了原数组,就不用再分配新的空间了,这也是一种比较常用的做法。
在实际代码里我对i,j移动的时机做了一些改动,结果是一样的,但是看起来可能更简单,也可以分成四种情况逐一用if...else if来写。
accept代码

class Solution {public:    vector<int> sortArrayByParity(vector<int>& A) {        int i = 0, j = A.size() - 1;        int n = A.size();        while (i < j)        {            if (A[i] % 2 != 0 && A[j] % 2 != 1)                swap(A[i++], A[j--]);            if (A[i] % 2 == 0)                i++;            if (A[j] % 2 == 1)                j--;        }        return A;    }

};

重点:

  • 两个指针