LeetCode - 解题笔记 - 75 - Sort Colors

Solution 1

荷兰国旗问题。

两个指针分别从两端开始维护,记为左侧保存0的red指针以及右侧保存2的blue指针,从左到右逐渐遍历到右指针:

  1. 如果当前元素为2,那么不断地与blue交换位置并左移blue,直到被交换到遍历位置的元素不再是2
  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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值