75. 颜色分类
分析
经典的荷兰国旗问题,通过双指针和单次遍历的方式完成排序
将数组分为三个区域:
- 左区域(存放红色
0的区域) - 右区域(存放蓝色
2的区域) - 中间区域(存放白色
1的区域)
-
使用三个指针:
i: 指向左区域的边界j: 当前正在遍历的元素位置k: 指向右区域的边界
-
初始化
i = 0、j = 0、k = n-1 -
遍历数组,判断 \text{nums}[j] :
- 如果是
1(白色),直接跳过,j++ - 如果是
0(红色),将nums[j]和nums[i]交换,i++,j++ - 如果是
2(蓝色),将nums}[j]和nums}[k]交换,k–-(注意:此时j不前进,继续检查新的nums[j]
- 如果是
-
遍历结束后,数组即为排序后的结果
时间复杂度
整个数组只遍历了一次,时间复杂度为 O(n)
空间复杂度
空间复杂度为 O(1)
C++代码
|
|