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

Leecode热题100-75.颜色分类

给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地 对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。

我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。

必须在不使用库内置的 sort 函数的情况下解决这个问题。

示例 1:

输入:nums = [2,0,2,1,1,0]
输出:[0,0,1,1,2,2]

示例 2:

输入:nums = [2,0,1]
输出:[0,1,2]

提示:

  • n == nums.length
  • 1 <= n <= 300
  • nums[i] 为 01 或 2

进阶:

  • 你能想出一个仅使用常数空间的一趟扫描算法吗?

写就写进阶的解,这还不简单,直接上代码,看不懂可以私信或评论,第一时间解答

class Solution {/**这个题目也是听起来比较唬人,但是这个仔细想想如果按照数字来看,不就是红色最小,白色居中,蓝色最大吗这是啥问题?荷兰国旗啊,下面我们用荷兰国旗问题解一下,这就是荷兰国旗里的Partition */public void sortColors(int[] nums) {/**如果就一个那就直接返回吧,没啥可操作的*/if(nums.length == 1) {return;}/**开始进行划分,redLast表示确定的红的最后一个位置,目前还没有,blueFirst表示确定的蓝色的第一个位置,目前也还没有*/int redLast = -1;int blueFirst = nums.length;int cur = 0;while(cur < blueFirst) {/**等于的不管 */if(nums[cur] == 1) {cur ++;/**如果是0和红色的最后一个位置的下一个交换,扩充红色区,因为换的是之前的位置,所以这里cur不用验证,也直接++ */} else if(nums[cur] == 0) {swap(nums, cur++, ++redLast);} else {/**如果是2,就和蓝色的最后一个位置的前一个交换,扩充红色区,但是这个是从后面缓过来的,需要看看*/swap(nums, cur, --blueFirst);}}}public void swap(int[] nums, int i, int j) {int temp = nums[i];nums[i] = nums[j];nums[j] = temp;}
}

http://www.lryc.cn/news/452222.html

相关文章:

  • 408算法题leetcode--第22天
  • dubbo微服务
  • 如何在 DAX 中计算多个周期的移动平均线
  • 微信小程序 图片的上传
  • 软件测试人员发现更多程序bug
  • Nagle 算法:优化 TCP 网络中小数据包的传输
  • C#入门教程
  • 【MySQL报错】---Data truncated for column ‘age‘ at row...
  • Go基础学习08-并发安全型类型-通道(chan)深入研究
  • some 蓝桥杯题
  • [linux 驱动]input输入子系统详解与实战
  • 2023_Spark_实验十:Centos_Spark Local模式部署
  • pyecharts-快速入门
  • vue3打包疯狂报错
  • STM32 软件触发ADC采集
  • Android SystemUI组件(08)睡眠灭屏 锁屏处理流程
  • C# 表达式与运算符
  • SpringBoot--最大连接数和最大并发数
  • CF687D Dividing Kingdom II 题解
  • 高空抛物AI检测算法:精准防控,技术革新守护城市安全
  • html+css+js实现Collapse 折叠面板
  • RM服务器研究(一)
  • 云岚到家xxl job 配置
  • 国内动态短效sk5
  • 【路径规划】路径平滑算法,A星算法拐点的圆弧化处理
  • 【寻找one piece的算法之路】——双指针算法!他与她是否会相遇呢?
  • UFS 3.1架构简介
  • 注册安全分析报告:科研诚信查询平台无验证方式导致安全隐患
  • 04.useTitle
  • ROS2中的srv、action、发布订阅三种方式