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

【LeetCode热题100道笔记+动画】颜色分类

题目描述

给定一个包含红色、白色和蓝色、共 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] 为 0、1 或 2

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

思考一:计数

计数排序法:通过两次遍历数组完成排序。

  1. 第一次遍历统计数组中0、1、2的出现次数
  2. 第二次遍历根据统计结果重新赋值数组,按0、1、2的顺序依次填充

算法过程

  1. 初始化两个计数器zeros和ones,分别记录0和1的出现次数
  2. 遍历数组,统计0和1的数量(2的数量可通过数组长度减去前两者得到)
  3. 重新填充数组:
    • 前zeros个位置填充0
    • 接下来ones个位置填充1
    • 剩余位置填充2

时间复杂度

  • 时间复杂度:O(n),需遍历数组两次(n为数组长度)
  • 空间复杂度:O(1),仅使用常数级额外空间

代码

/*** @param {number[]} nums* @return {void} Do not return anything, modify nums in-place instead.*/
var sortColors = function(nums) {const n = nums.length;let zeros = 0, ones = 0;for (let num of nums) {if (num === 0) {zeros++;} else if (num === 1) {ones++;}}for (let i = 0; i < zeros; i++) {nums[i] = 0;}for (let i = 0; i < ones; i++) {
http://www.xdnf.cn/news/19462.html

相关文章:

  • 【面试场景题】如何快速判断几十亿个数中是否存在某个数
  • python-pptx 库(最常用,适合生成/修改 PPT 文件)
  • 深入解析quiche开源项目:从QUIC协议到云原生实践
  • 大模型微调与LoRA/QLoRA方法解析
  • 四、练习1:Git基础操作
  • Python爬虫实战:研究Colormap,构建优质色彩方案数据采集和分析系统
  • 学习:uniapp全栈微信小程序vue3后台-暂时停更
  • C# Task 入门:让你的程序告别卡顿
  • 一文读懂k8s的pv与pvc原理
  • 【Proteus仿真】8*8LED点阵控制系列仿真——循环显示数字/按键控制显示图案
  • 【Netty4核心原理⑭】【Netty 内存分配 ByteBuf❷】
  • 计算机组成原理1 组成与各部件流程 9.1
  • 国内服务器如何安装docker或者是1panel
  • 鸿蒙总改变字体大小设置
  • 计算机网络---https(超文本传输安全协议)
  • Kafka面试精讲 Day 4:Consumer消费者模型与消费组
  • SQLSERVER关键字
  • npm 打包上传命令,撤销错误版本
  • 智能核心:机器人芯片的科技革新与未来挑战
  • 开源npm引导guide组件
  • GIT(了解)
  • 音视频开发入门:FFmpeg vs GStreamer,新手该如何选择?
  • 前端数据可视化:基于Vue3封装 ECharts 的最佳实践
  • Prometheus Alertmanager 告警组件学习
  • GD32F303在移植FreeRTOS时,系统卡死在Systick_Handler B.的处理方法
  • 164.在 Vue3 中使用 OpenLayers 加载 Esri 地图(多种形式)
  • 后端Web实战-多表操作员工列表查询
  • Spring Bean生命周期的完全指南
  • 面试常考css:三列布局实现方式
  • Interceptor拦截器入门知识及其工作原理