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

湖南网站优化服务手机免费创网站

湖南网站优化服务,手机免费创网站,网站后台管理入口,温州网站排名团队题目描述 题目分析 本题是经典的「荷兰国旗问题」,由计算机科学家 Edsger W. Dijkstra 首先提出。 要想单独解决这道题本身还是很简单的,统计0、1、2的数量然后按顺序赋值,或者手写一个冒泡排序,whatever。 但是在这一题中我们主…

题目描述

在这里插入图片描述

题目分析

本题是经典的「荷兰国旗问题」,由计算机科学家 Edsger W. Dijkstra 首先提出。
要想单独解决这道题本身还是很简单的,统计0、1、2的数量然后按顺序赋值,或者手写一个冒泡排序,whatever。
但是在这一题中我们主要学习它的思想,题目想要将一个数组分成三个区间,那么就要用到三指针法。时间复杂度O(n)。
在本文的最后会附上leetcode的双指针法,但是本文的主要目的就是学会三指针法,不管哪种方式,核心思想是差不多的,本题的思想同样也是快速排序中对于大量重复元素的优化方式,甚至可以直接作为快排的核心算法。

讲解算法原理

既然想要将一个数组分为0、1、2三个区域,那就定义三个指针来解决这个问题。
指针意义:
i 指向数组第一个元素的位置用来遍历数组
left 指向数组0区间最后一个元素
right 指向数组2区间第一个元素

整个数组在完成分区之后的指针位置分布是这样的,数组由三个部分字组成:

在这里插入图片描述
注:x 为0区间最后一个元素, y 为2区间第一个元素

整个数组在正在分区的过程中时的指针位置分布是这样的,数组由四个部分组成:

在这里插入图片描述

我们主要就是要研究正在分区时的指针分布,来规定循环条件以及各种操作。
数组在分区时分为四个区间:
[0, left] [left + 1, i - 1] [i, right -1] [right, n]
从左到右依次是:0区间,1区间,待扫描区域,2区间
当待扫描区域消失后,数组分区就完成了

那么在最刚开始各个指针是怎么分布的呢?

以示例一为例:
nums = [2,0,2,1,1,0]

指针的初始化

在这里插入图片描述

在最刚开始,数组并没有0区间和2区间,所以left指向数组第一个元素的左边位置,right指向数组的最后一个元素的右边位置,i指向数组的第一个元素。

i 指针扫描到不同数据的分类处理1

  1. 当i扫描到0时,将i位置的元素与left + 1位置的元素交换,然后再left++,就将0放到了0区间中,最后再i++,准备扫描下一个元素。
    Q:为什么不直接与left交换?
    A:我们不能直接与left交换,因为left在刚开始是不在数组范围内的。我们是通过将left扩容的方式来涵盖0这个元素。
  2. 当i扫描到2时,将i位置的元素与right - 1位置的元素交换,然后再right–,就将2放到了2区间中,此时i还不能急着++,因为新换过来的元素还没有扫描。就这样进入到下一次循环中,i会再处理这个新换来的元素。
  3. 当i扫描到1时,直接i++,1就进入了1区间。
    请添加图片描述
    请添加图片描述
class Solution {
public:void sortColors(vector<int>& nums) {int left = -1,right = nums.size(); //left为0区间的最后一个元素位置,right为2区间的第一个元素位置int i = 0; //i指针遍历整个数组while(i < right) //[0,left],[left+1,i-1],[i,right-1],[right,n]{if(nums[i] == 0) {swap(nums[i],nums[left+1]);left++;i++;}else if(nums[i] == 1) i++;else {swap(nums[i],nums[right]);right--;}}  }
};

简写后:

class Solution {
public:void sortColors(vector<int>& nums) {int left = -1,right = nums.size(); //left为0区间的最后一个元素位置,right为2区间的第一个元素位置int i = 0; //i指针遍历整个数组while(i < right) //[0,left],[left+1,i-1],[i,right-1],[right,n]{if(nums[i] == 0) swap(nums[i++],nums[++left]);else if(nums[i] == 1) i++;else swap(nums[i],nums[--right]);}  }
};

补充:
leetcode官方给出的双指针法也是经典的方法,在此引用供大家学习:
在这里插入图片描述
在这里插入图片描述
题解作者:力扣官方
题解链接:https://leetcode.cn/problems/sort-colors/solutions/437968/yan-se-fen-lei-by-leetcode-solution/


文章转载自:

http://mLwD7yYg.fnmgr.cn
http://oMPRdvZ5.fnmgr.cn
http://FexU0qQF.fnmgr.cn
http://beCPm3M0.fnmgr.cn
http://bCsG6su7.fnmgr.cn
http://nGTHFqHM.fnmgr.cn
http://PPeC2ONt.fnmgr.cn
http://AaVaUxAv.fnmgr.cn
http://mPDK9ynY.fnmgr.cn
http://fP9T6H1c.fnmgr.cn
http://0p0MzRTL.fnmgr.cn
http://vZe4u4rf.fnmgr.cn
http://BXLqyikO.fnmgr.cn
http://TzkBtnP6.fnmgr.cn
http://93sCxscM.fnmgr.cn
http://in73q64X.fnmgr.cn
http://U99qYAdl.fnmgr.cn
http://ZipsFjzD.fnmgr.cn
http://XEmZsP1h.fnmgr.cn
http://rbDMqJyu.fnmgr.cn
http://5tGkqHiK.fnmgr.cn
http://mF0j5QwO.fnmgr.cn
http://vJX9THIk.fnmgr.cn
http://lKbAFBcp.fnmgr.cn
http://qV73JUOe.fnmgr.cn
http://JoKWVbIu.fnmgr.cn
http://Rl2OIxcR.fnmgr.cn
http://NLpMkPhO.fnmgr.cn
http://fiuJWaBW.fnmgr.cn
http://xUOlnghB.fnmgr.cn
http://www.dtcms.com/wzjs/705807.html

相关文章:

  • 实用网站开发北京 建公司网站要多少钱
  • 网站建设广州哪家好青岛vi设计公司
  • 北京品牌建设网站公司排名wordpress newsroom
  • 做微商有什么好的货源网站济宁竞价托管
  • 家具网站策划书设计logo网站赚钱
  • 南京做代账会计在哪个网站上找家政公司响应式网站建设案例
  • 网站开发前期准备门户网站设计说明
  • 万江做网站北京网络营销培训
  • 行业网站网址医疗网站建设渠道
  • wordpress入门建站教程二建筑方案设计流程步骤
  • 个人备案网站做电影站查网站是什么公司做的
  • 做网站下载那个数据库好电子商务主要学什么内容
  • 做网站设计都需要什么数码类网站名称
  • 深圳动态科技集团网站互联网建站网站
  • 广州市网站建设 骏域贵阳网络营销推广专家
  • 网站怎么没有排名做网站一定需要虚拟主机吗
  • 网站模板 自适应京东店铺购买平台
  • 成都营销型网站建设及推广那家好四川seo推广
  • 怎么随便搞个网站网址关键词查询
  • 网站应该怎么做的网页设计培训班
  • 长沙商业网站建设淄博论坛网站建设
  • 上海网站定制公司怎么免费弄网站
  • 手机网站和电脑网站样式的区别厦门找一家做网站的公司
  • 问卷调查网站怎么做自适应平台网站模板
  • 郑州高端网站建设团队阿里云服务器租用
  • 青岛网站域名备案查询镇海官方网站建设
  • 个人做流量大的网站申请注册邮箱
  • 石家庄seo网站建设互联网内容服务商
  • 广西南宁电商网站建设用静态网站更新
  • wordpress自动网站地址域名的作用