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

力扣hot100:75. 颜色分类(双指针)

75.颜色分类

本题是经典的「荷兰国旗问题」,由计算机科学家 Edsger W. Dijkstra 首先提出。

75. 颜色分类

在这里插入图片描述

1、遍历两遍

遍历两遍,第一遍放置0的位置,第二遍放置1的位置,我们只需要维护一个当前放置位置即可。
在这里插入图片描述

class Solution {
public:void sortColors(vector<int>& nums) {//扫描两遍,第一遍放好0的位置,第二遍放1int zero = 0;for(int i = 0; i < nums.size(); ++ i){if(nums[i] == 0){swap(nums[i], nums[zero ++]);}}//复用zerofor(int j = zero; j < nums.size(); ++ j){if(nums[j] == 1){swap(nums[j], nums[zero ++]);}}return;}
};

2、遍历一遍双指针

difficult to achieve

我们维护一个0的位置,并且维护一个1的位置:

  • 确保1的位置不小于0的位置
  • 当需要放入1时,直接加在当前指向需要放置的1的位置即可。
  • 当需要放入0时,如果后面有1,这会打断1,不过,我们可以把这个1再插入1的位置即可。如果没有1直接放入

这种方法比较难写,情况有点多,实现起来比较复杂。由于时间复杂度差不多,因此推荐使用简单方法实现!

class Solution {
public:void sortColors(vector<int>& nums) {//扫描两遍,第一遍放好0的位置,第二遍放1int zero = 0;int one = 0;for(int i = 0; i < nums.size(); ++ i){//确保one在正确位置,情况分类比较难if(nums[i] == 1){swap(nums[i], nums[one ++]);}else if(nums[i] == 0){if(zero == one){swap(nums[zero ++], nums[i]);one ++;}else{if(zero < one && zero != 0){//0有数,1也有数swap(nums[one ++], nums[i]);nums[one - 1] = 1;nums[zero ++] = 0;}else{//0没数if(one != i){nums[zero ++] = 0;swap(nums[one], nums[i]);nums[one] = 1;}else{swap(nums[zero ++],nums[i]);}one++;}}}}return;}
};

3、双指针交换2的位置

class Solution {
public:void sortColors(vector<int>& nums) {int n = nums.size();int p0 = 0, p2 = n - 1;for (int i = 0; i <= p2; ++i) {while (i <= p2 && nums[i] == 2) {swap(nums[i], nums[p2]);--p2;}if (nums[i] == 0) {swap(nums[i], nums[p0]);++p0;}}}
};

相关文章:

  • 数据中台-知识图谱平台
  • Windows系统下使用gvim配置LaTeX快速书写环境
  • idea 启动tomcat后总是弹出框显示cannot open url.please check this url is correct
  • 精准定位,智慧提纯:高级数据提取策略
  • MySQL基础——SQL语句
  • 混淆矩阵-召回率、精确率、准确率
  • 【iOS】UI学习——cell的复用及自定义cell
  • 提升学术研究效率与质量的关键
  • 2024050802-重学 Java 设计模式《实战模板模式》
  • Shell脚本从入门到实战
  • 机器学习的分类
  • python学习:语法(2)
  • 数据仓库和数据库有什么区别?
  • 教资认定报名照片要求小于190kb…
  • 服务器数据恢复—EMC Isilon存储中被误删的虚拟机数据恢复案例
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • 【译】理解JavaScript:new 关键字
  • axios 和 cookie 的那些事
  • CentOS从零开始部署Nodejs项目
  • css的样式优先级
  • Github访问慢解决办法
  • js正则,这点儿就够用了
  • Linux后台研发超实用命令总结
  • MYSQL 的 IF 函数
  • php的插入排序,通过双层for循环
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 前端js -- this指向总结。
  • 前端路由实现-history
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 软件开发学习的5大技巧,你知道吗?
  • 三栏布局总结
  • 少走弯路,给Java 1~5 年程序员的建议
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 推荐一个React的管理后台框架
  • 系统认识JavaScript正则表达式
  • 新书推荐|Windows黑客编程技术详解
  • 一个SAP顾问在美国的这些年
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 湖北分布式智能数据采集方法有哪些?
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • (ZT)出版业改革:该死的死,该生的生
  • (层次遍历)104. 二叉树的最大深度
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • .cfg\.dat\.mak(持续补充)
  • .NET8 动态添加定时任务(CRON Expression, Whatever)
  • .net操作Excel出错解决
  • .Net转Java自学之路—SpringMVC框架篇六(异常处理)
  • .net最好用的JSON类Newtonsoft.Json获取多级数据SelectToken
  • 。。。。。
  • [<死锁专题>]