leetcode数组array标签题目更新中

40次阅读

共计 617 个字符,预计需要花费 2 分钟才能阅读完成。

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;
    }

};

重点:

  • 两个指针

正文完
 0