(1过,解法不好,看參考荷兰国旗问题解法)
给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
注意:
不能使用代码库中的排序函数来解决这道题。
示例:
输入: [2,0,2,1,1,0]
输出: [0,0,1,1,2,2]
进阶:
- 一个直观的解决方案是使用计数排序的两趟扫描算法。
首先,迭代计算出0、1 和 2 元素的个数,然后按照0、1、2的排序,重写当前数组。 - 你能想出一个仅使用常数空间的一趟扫描算法吗?
- 一个直观的解决方案是使用计数排序的两趟扫描算法。
我的:双指针都在前
public void sortColors(int[] A) {int redindex = 0;int whiteindex = 0;int temp1=0;for (int i=0;i
参考:双指针一前一后
链接:https://www.nowcoder.com/questionTerminal/4345e55fdb03498a89a97ec18e62b3ab
来源:牛客网//荷兰国旗问题,基本思路是,遍历数组跟中间值1做比较,主要有以下两步:
//1、设置最后一个连续0的位置索引(从前往后),设置第一个连续2的位置索引(从后往前)
//2、如果遍历到0,就交换,此时不用考虑交换后的ind位置的值(因为如果后面还有0会继续替换),
//如果遇到2,需要与连续2的位置索引交换,但此时ind不能++(因为如果++后面就没有机会和2的索引位置交换值了)
class Solution {
public:void sortColors(int A[], int n) {int zeroInd &#61; 0,twoInd &#61; n-1;for(int ind&#61;0;ind<&#61;twoInd;ind&#43;&#43;){if(A[ind]&#61;&#61;0){A[ind] &#61; A[zeroInd];A[zeroInd] &#61; 0;zeroInd&#43;&#43;;}else if(A[ind]&#61;&#61;2){A[ind] &#61; A[twoInd];A[twoInd] &#61; 2;twoInd--;ind--;}}}
};