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

三色排序:荷兰国旗最优解,sql题目基础50题。

问题描述

LeetCode 75题“颜色分类”要求将一个包含红色(0)、白色(1)和蓝色(2)的数组原地排序,使得相同颜色的元素相邻且按红、白、蓝的顺序排列。这个问题也被称为“荷兰国旗问题”,由计算机科学家Edsger Dijkstra提出,用于解决三色分类问题。

荷兰国旗问题解法

荷兰国旗问题的核心思想是通过分区将数组划分为三个部分:红色区、白色区和蓝色区。使用三个指针(low、mid、high)来实现分区:

  • low指向红色区的末尾。
  • mid用于遍历当前元素。
  • high指向蓝色区的起始位置。

初始化时,lowmid指向数组起始位置,high指向数组末尾。遍历过程中:

  • 如果nums[mid] == 0,交换nums[low]nums[mid],并将lowmid右移。
  • 如果nums[mid] == 1mid右移。
  • 如果nums[mid] == 2,交换nums[mid]nums[high],并将high左移。
def sortColors(nums): low, mid, high = 0, 0, len(nums) - 1 while mid <= high: if nums[mid] == 0: nums[low], nums[mid] = nums[mid], nums[low] low += 1 mid += 1 elif nums[mid] == 1: mid += 1 else: nums[mid], nums[high] = nums[high], nums[mid] high -= 1

插入排序解法

插入排序是一种简单的排序算法,适用于小规模数据或部分有序数据。对于颜色分类问题,可以通过插入排序逐步将元素插入到正确的位置:

  • 从第二个元素开始遍历数组。
  • 将当前元素与前面的元素比较,如果前面的元素更大,则交换位置。
  • 重复直到当前元素到达正确位置。
def sortColors(nums): for i in range(1, len(nums)): key = nums[i] j = i - 1 while j >= 0 and nums[j] > key: nums[j + 1] = nums[j] j -= 1 nums[j + 1] = key

分区解法

分区是快速排序的核心步骤,也可以用于颜色分类问题。通过两次分区将数组分为三部分:

  • 第一次分区将红色(0)移到左侧。
  • 第二次分区将白色(1)移到中间,蓝色(2)自然位于右侧。
def sortColors(nums): # 第一次分区:将0移到左侧 boundary = 0 for i in range(len(nums)): if nums[i] == 0: nums[i], nums[boundary] = nums[boundary], nums[i] boundary += 1 # 第二次分区:将1移到中间 boundary = boundary for i in range(boundary, len(nums)): if nums[i] == 1: nums[i], nums[boundary] = nums[boundary], nums[i] boundary += 1

性能分析

  • 荷兰国旗解法:时间复杂度为O(n),仅需一次遍历,空间复杂度为O(1),是最优解法。
  • 插入排序解法:时间复杂度为O(n^2),空间复杂度为O(1),适用于小规模数据。
  • 分区解法:时间复杂度为O(n),但需要两次遍历,空间复杂度为O(1)。

应用场景

荷兰国旗问题不仅适用于颜色分类,还可以扩展到多分区排序问题。插入排序和分区解法虽然简单,但在特定场景下仍有应用价值。

http://www.cnnetsun.cn/news/1453118.html

相关文章:

  • Z-Image-Turbo-辉夜巫女Gradio性能压测:单卡支持最大并发数与平均响应时间
  • 黑客的隐秘武器:SQL注入与防御全攻略
  • 零代码自动化:OpenClaw+ollama-QwQ-32B快速搭建个人RSS阅读器
  • 终极指南:3分钟快速上手docx2tex,免费将Word文档转换为专业LaTeX
  • Appium 全解|博客视角:从架构、实战到企业级落地,移动端自动化测试的 “瑞士军刀”
  • 基于Python的社区老人健康信息管理系统毕业设计
  • 3张RTX 4090显卡也能玩转Qwen-Image?手把手教你低成本部署阿里最强开源文生图模型
  • LiuJuan20260223Zimage部署故障排查:解决403 Forbidden等常见网络错误
  • GitHub爆火的“印钞机“:我跑了3天代码,亏了200块,终于看清了真相
  • AI工具会不会让人变懒?我试了三个月后的答案 创意推敲这块
  • kvm aarch64 原理详解
  • 逍遥模拟器抓包实战:手把手教你用Burp Suite解密HTTPS的APK通信(2024版)
  • DanKoe 视频笔记:寻找意义:如何找到上帝
  • N76E003开发环境搭建避坑指南:从Keil C-51安装到Nu-Link驱动配置
  • Asian Beauty Z-Image Turbo 学术应用:辅助LaTeX论文插图与学术海报的快速生成
  • 【嵌入式】读代码之startup_stm32f103xb.s
  • MySQL 事务锁冲突排查
  • 手把手教你用STM32F405和RDA5807打造便携式数字收音机(附完整代码)
  • 家用Wi-Fi安全升级指南:WPA3还没普及?先搞定WPA2的这些关键设置
  • React Web完全指南:如何用React Native API构建跨平台Web应用
  • VLC播放器美化终极指南:5款VeLoCity主题让你的播放器焕然一新
  • supervisor 监控工具-superlance
  • Flutter GetX实战:5分钟搞定跨页面交互与状态管理
  • 别再只做静态页面了!用Three.js+GIS给你的旅游网站加点‘黑科技’
  • FPGA温度监测实战:手把手教你用SYSMONE4获取Ultrascale芯片温度(附计算公式)
  • 避坑指南:华为HCIA考试中最容易混淆的5个网络概念(含MAC地址查询技巧)
  • CLIP-GmP-ViT-L-14图文匹配工具参数详解:图像/文本编码器输出维度与logits归一化
  • 告别VSCode远程开发:用Xshell+ProxyJump打造轻量级服务器连接方案
  • 从CVE-2024-1086漏洞复现失败到成功:一次内核安全实践的技术复盘
  • NxNandManager完全指南:Nintendo Switch NAND管理从入门到精通(含避坑手册)