Solution 1
荷兰国旗问题。
两个指针分别从两端开始维护,记为左侧保存0的red指针以及右侧保存2的blue指针,从左到右逐渐遍历到右指针:
- 如果当前元素为2,那么不断地与blue交换位置并左移blue,直到被交换到遍历位置的元素不再是2
- 再检查当前元素是否为0,那么与red进行交换,red右移
- 时间复杂度: O ( n ) O(n) O(n),其中 n n n为输入长度,线性遍历
- 空间复杂度: O ( 1 ) O(1) O(1),仅维护常数个状态变量
class Solution {
public:
void sortColors(vector<int>& nums) {
int red = 0, blue = nums.size() - 1;
for (int i = 0; i <= blue; ++i) {
if (nums[i] == 2) {
while (i <= blue && nums[i] == 2) {
swap(nums[i], nums[blue--]);
}
}
if (nums[i] == 0) {
swap(nums[i], nums[red++]);
}
}
}
};
Solution 2
Solution 1的Python实现。
class Solution:
def sortColors(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
red, blue = 0, len(nums) - 1
i = 0
while i <= blue:
# print(red, blue, i, nums)
if nums[i] == 2:
while i <= blue and nums[i] == 2:
nums[i], nums[blue] = nums[blue], nums[i]
blue -= 1
if nums[i] == 0:
nums[i], nums[red] = nums[red], nums[i]
red += 1
# print(red, blue, i, nums)
i += 1