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++代码
|
|