zoukankan      html  css  js  c++  java
  • 【转】荷兰国旗问题 三指针排序

    方法一: 一次遍历
    直觉

    本问题被称为 荷兰国旗问题
    ,最初由 Edsger W. Dijkstra提出。
    其主要思想是给每个数字设定一种颜色,并按照荷兰国旗颜色的顺序进行调整。

     

    我们用三个指针(p0, p2 和curr)来分别追踪0的最右边界,2的最左边界和当前考虑的元素。

     

    本解法的思路是沿着数组移动 curr 指针,若nums[curr] = 0,则将其与 nums[p0]互换;若 nums[curr] = 2 ,则与 nums[p2]互换。

    算法

    初始化0的最右边界:p0 = 0。在整个算法执行过程中 nums[idx < p0] = 0.

    初始化2的最左边界 :p2 = n - 1。在整个算法执行过程中 nums[idx > p2] = 2.

    初始化当前考虑的元素序号 :curr = 0.

    While curr <= p2 :

    若 nums[curr] = 0 :交换第 curr个 和 第p0个 元素,并将指针都向右移。

    若 nums[curr] = 2 :交换第 curr个和第 p2个元素,并将 p2指针左移 。

    若 nums[curr] = 1 :将指针curr右移。

    实现

    复杂度分析

    时间复杂度 :由于对长度 NN的数组进行了一次遍历,时间复杂度为O(N)O(N) 。

    空间复杂度 :由于只使用了常数空间,空间复杂度为O(1)O(1) 。

    作者:LeetCode
    链接:https://leetcode-cn.com/problems/sort-colors/solution/yan-se-fen-lei-by-leetcode/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 相关阅读:
    day84
    模型层之单表操作
    Django的模板层
    Django框架导读
    创建Django项目
    名称空间2.0path
    js基础之BOM和DOM
    LG5003 跳舞的线
    20191003 「HZOJ NOIP2019 Round #8」20191003模拟
    LG3092 「USACO2013NOV」No Change 状压DP
  • 原文地址:https://www.cnblogs.com/lau1997/p/12740960.html
Copyright © 2011-2022 走看看