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

网站数据库购买建设银行官方网站个人系统板块

网站数据库购买,建设银行官方网站个人系统板块,道路运输电子证照,河北沧州网站建设文章目录 问题描述算法思路:三指针分区法核心思想指针定义 Java实现算法执行流程关键问题解析:为什么交换0后不需要重新检查?交换0时的两种情况分析详细解释: 复杂度分析示例演示(输入:[2,0,2,1,1,0]&#…

文章目录

    • 问题描述
    • 算法思路:三指针分区法
      • 核心思想
      • 指针定义
    • Java实现
    • 算法执行流程
    • 关键问题解析:为什么交换0后不需要重新检查?
      • 交换0时的两种情况分析
      • 详细解释:
    • 复杂度分析
    • 示例演示(输入:[2,0,2,1,1,0])
    • 总结

本文介绍一种时间复杂度O(n)、空间复杂度O(1)的优雅解法,通过双指针技术实现颜色分类的一趟扫描排序

问题描述

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

示例:

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

算法思路:三指针分区法

核心思想

使用三个指针将数组分为四个区域:

  1. [0, p0):已排序的0区域
  2. [p0, curr):已排序的1区域
  3. [curr, p2]:待处理区域
  4. (p2, end]:已排序的2区域

指针定义

  • p0:指向下一个0应放置的位置(0区域的右边界)
  • p2:指向下一个2应放置的位置(2区域的左边界)
  • curr:当前遍历指针,负责处理元素交换

Java实现

class Solution {public void sortColors(int[] nums) {if (nums == null || nums.length < 2) return;int p0 = 0;                   // 0区域右边界int p2 = nums.length - 1;     // 2区域左边界int curr = 0;                 // 当前遍历指针while (curr <= p2) {switch (nums[curr]) {case 0:// 将0交换到0区域swap(nums, curr++, p0++);break;case 1:// 1保留在中间区域curr++;break;case 2:// 将2交换到2区域swap(nums, curr, p2--);// 注意:curr不自增,需检查交换来的新元素break;}}}// 辅助交换函数private void swap(int[] nums, int i, int j) {int temp = nums[i];nums[i] = nums[j];nums[j] = temp;}
}

算法执行流程

  1. 初始化指针

    • p0 = 0(0区域起始位置)
    • p2 = nums.length-1(2区域起始位置)
    • curr = 0(从数组开头遍历)
  2. 元素处理逻辑

    • 遇到0:与p0交换,p0curr右移
    • 遇到1:跳过,curr右移
    • 遇到2:与p2交换,p2左移(curr不变)
  3. 终止条件curr > p2(所有元素处理完毕)

关键问题解析:为什么交换0后不需要重新检查?

交换0时的两种情况分析

情况条件交换前状态交换后状态
情况1curr > p0nums[p0] = 1nums[curr] = 1
情况2curr == p0自身交换保持不变

详细解释:

  1. curr > p0

    • p0位置必定是1(因为0区域和1区域已排序)
    • 交换后curr位置变为1 → 可直接跳过处理(1属于中间区域)
  2. curr == p0

    • 自身交换无实际变化
    • 元素保持0 → 属于已排序区域

结论:交换0后curr位置的新元素只可能是0或1,都无需再次处理,因此可以直接移动curr指针。

复杂度分析

指标说明
时间复杂度O(n)单次遍历完成排序
空间复杂度O(1)仅使用常数级额外空间

示例演示(输入:[2,0,2,1,1,0])

步骤操作数组状态指针变化
1初始状态[2,0,2,1,1,0]p0=0, p2=5, curr=0
2处理2:交换curr↔p2[0,0,2,1,1,2]p2=4
3处理0:交换curr↔p0[0,0,2,1,1,2]p0=1, curr=1
4处理0:交换curr↔p0[0,0,2,1,1,2]p0=2, curr=2
5处理2:交换curr↔p2[0,0,1,1,2,2]p2=3
6处理1:跳过[0,0,1,1,2,2]curr=3
7处理1:跳过[0,0,1,1,2,2]curr=4 > p2(结束)

总结

双指针法解决颜色分类问题的核心在于:

  1. 通过p0p2维护已排序区域
  2. curr指针动态处理待排序区域
  3. 巧妙利用交换操作实现元素归位
  4. 利用数组分区特性优化操作步骤(交换0后无需重检)

该算法是荷兰国旗问题的经典解法,体现了双指针技术在数组原地操作中的高效性,是面试中的高频考点。

http://www.dtcms.com/wzjs/572735.html

相关文章:

  • 网站推广方案设计郑州外贸网站建设公司价格
  • 做的最好的门户网站旅游网站建设设计公司
  • 福建网站建设科技有限公司站长seo软件
  • 司法行政网站建设目的凡科网站产品导航怎么做
  • 怎么建立自己网站视频做机械一般做那个外贸网站
  • 一级a做爰片免费的网站有吗电子商务网站建设的试卷
  • 外卖网站那家做的好别人买了域名做违法网站
  • 项目网站建设应入哪个科目直播系统开发公司
  • 在本地做改版如何替换旧网站会影响百度收录吗响应式网站 尺寸
  • 网站推广软文欣赏网站群建设座谈会
  • 网站建设书案例办公室设计布局平面图
  • 普陀做网站wordpress数据库链接地址
  • 安徽伟诚建设工程有限公司网站简单小网站
  • 网站封装成app可以做热更新买一个网站多少钱
  • 团购网站怎么做大良营销网站建设策划
  • 建站系统cmsios网页游戏
  • 番禺广州网站建设企点qq官网
  • 上海网站建设规范云安区市场网络营销方法
  • 西宁做网站的工作室网站建设上传图片不显示
  • 珠海网站制作网络公司网站上怎么做游戏
  • 高端html5网站建设的思路网站建设经验做法和取得的成效
  • 专业做网站制作自助建站系统销售网站建设公司
  • 网站设计行业资讯html源码查看在线
  • 网站建设员工资wordpress 推广提成
  • 如何做网站主题wordpress网址转跳页面插件
  • 济南建设网站公司常见的跨境电商平台有哪些
  • 纪实摄影网站推荐wordpress的html编辑器插件
  • 能支持微信公众号的网站建设垂直门户网站有哪些
  • 优化网站价格本溪网站制作
  • 网站抓取压力高wordpress自己写界面