问题描述: 给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排 列。 此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
时间: 2024-06-09 16:11:24 浏览: 122
这个问题可以使用荷兰国旗问题的解法来解决。荷兰国旗问题是由计算机科学家 Edsger Dijkstra 提出的,它的思路是维护三个指针,分别指向当前已经排序好的红色区域的右边界、当前已经排序好的白色区域的右边界和当前已经排序好的蓝色区域的左边界。初始时,红色区域和蓝色区域都是空的,白色区域包含整个数组。
具体的实现步骤如下:
1. 初始化红色区域的右边界为-1,白色区域的右边界为0,蓝色区域的左边界为n-1。
2. 当前元素为白色时,将白色区域的右边界向右移动一位。
3. 当前元素为红色时,将红色区域的右边界向右移动一位,并将当前元素与红色区域的下一个元素交换。
4. 当前元素为蓝色时,将蓝色区域的左边界向左移动一位,并将当前元素与蓝色区域的前一个元素交换。
5. 当白色区域的右边界与蓝色区域的左边界相遇时,排序完成。
代码实现如下:
```python
def sortColors(nums):
red, white, blue = -1, 0, len(nums)
while white < blue:
if nums[white] == 0:
red += 1
nums[red], nums[white] = nums[white], nums[red]
white += 1
elif nums[white] == 1:
white += 1
else:
blue -= 1
nums[blue], nums[white] = nums[white], nums[blue]
return nums
```
时间复杂度为O(n),空间复杂度为O(1)。
阅读全文