当前位置: 首页 > ai >正文

荷兰国旗问题 之 指针划分区间问题

文章目录

  • 首先介绍一下什么是荷兰国旗问题
  • 问题描述为:给定一个由红色、白色和蓝色三种颜色组成的无序数组,将数组元素按颜色排序,使得所有红色元素在前,白色元素居中,蓝色元素在后。这里的 “颜色” 通常用数字 0(红色)、1(白色)、2(蓝色) 表示,因此问题也等价于将数组中的 0、1、2 排序,使得所有 0 在前,1 居中,2 在后。
  • 当然这个问题,常常要求使用o(n)的时间复杂度进行求解

指针划分区间

  • 对于原地修改的操作,我们有两个思路,一个是单指针,两次遍历,另一个是双指针,单次遍历
    • 单指针,两次遍历:首先在第一次遍历中,我们定义变量ptr区间0的右边界(也就是下一个0的位置),然后遍历ptr右边的位置,当遇到0的时候,就执行nums[i]和nums[ptr]互换位置,然后ptr+=1,在第二次遍历的时候,我们从range(ptr,n)开始遍历,当遇到1的时候就执行类似的操作即可
    • 双指针,单次遍历:定义p0,p1分别为区间0和区间1的右边界,然后当遇到1的时候,我们只需交换nums[i]和nums[p1],然后p1+=1,如果遇到的是0,我们需要执行交换nums[i]和nums[p0],并且还要判断p0是否小于p1,因为如果小于的话,说明二者有重叠,所以刚刚交换出去的nums[p0]就会是1,所以需要考虑交换回来,还需要执行交换nums[i]和nums[p1],然后p1+=1,p0+=1

75.颜色分类
在这里插入图片描述

  • 思路分析:

单指针,两次遍历

class Solution:def sortColors(self, nums: List[int]) -> None:"""Do not return anything, modify nums in-place instead."""# 使用单指针,两次遍历ptr = 0 n = len(nums)for i in range(n):if nums[i] == 0:nums[ptr],nums[i] = nums[i],nums[ptr]ptr += 1for i in range(ptr,n):if nums[i] == 1:nums[ptr],nums[i] = nums[i],nums[ptr]ptr += 1

双指针,单次遍历

class Solution:def sortColors(self, nums: List[int]) -> None:"""Do not return anything, modify nums in-place instead."""# 使用双指针,单次遍历p0,p1 = 0,0 n = len(nums)for i in range(n):if nums[i] == 0:nums[i],nums[p0] = nums[p0],nums[i]if p0 < p1:nums[p1],nums[i] = nums[i],nums[p1]p0 += 1p1 += 1elif nums[i] == 1:nums[i],nums[p1] = nums[p1],nums[i]p1 += 1
http://www.xdnf.cn/news/6774.html

相关文章:

  • 开源项目实战学习之YOLO11:12.4 ultralytics-models-sam-memory_attention.py源码分析
  • 力扣-比特位计数(统计一个数二进制下1的个数)
  • React中useDeferredValue与useTransition终极对比。
  • p024基于Django的网上购物系统的设计与实现
  • LeetCode Hot100刷题——轮转数组
  • Python爬虫之路(14)--playwright浏览器自动化
  • LeetCode 153. 寻找旋转排序数组中的最小值:二分查找法详解及高频疑问解析
  • mysql数据库-中间件MyCat
  • 【LINUX操作系统】生产者消费者模型(下):封装、信号量与环形队列
  • 【赵渝强老师】在PostgreSQL中访问Oracle
  • “即时取模”的快读 → 数论
  • vscode vue 项目 css 颜色调色版有两个
  • 【Closure-Hayd】
  • Linux面试题集合(5)
  • RJ连接器的未来:它还会是网络连接的主流标准吗?
  • Vue.js教学第四章:Vue.js 模板语法之指令应用
  • 反射机制动态解析
  • 融智学视域下的系统性认知增强框架——基于文理工三类AI助理赋能HI四阶跃迁路径
  • MUSE Pi Pro 开发板 Imagination GPU 利用 OpenCL 测试
  • SpringBoot启动流程深入分析
  • JavaScript【5】DOM模型
  • AI赋能把“杂多集合”转化为“理想集合”的数学建模与认知升级
  • Git 版本控制系统入门指南
  • 基于Llama3的开发应用(二):大语言模型的工业部署
  • (C语言)超市管理系统 (正式版)(指针)(数据结构)(清屏操作)(文件读写)(网页版预告)(html)(js)(json)
  • java函数内的变量问题
  • 高频面试题(含笔试高频算法整理)基本总结回顾25
  • 汽车Wafer连接器:工业设备神经网络的隐形革命者
  • git提交库常用词
  • 深度学习---知识蒸馏(Knowledge Distillation, KD)