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

织梦做中英文网站免费发帖的网站

织梦做中英文网站,免费发帖的网站,wordpress禁止适应屏幕,wordpress sql查询分类目录 1.概论 2.朴素的二分算法 3.求左端点的二分算法和求右端点的二分算法 4.总结 1.概论 要想了解什么是二分算法,我们就要知道什么是二分算法,二分算法是根据数组的规律,每次查找的数据原来的效率可能要O(n),而我…

目录

1.概论

2.朴素的二分算法

3.求左端点的二分算法和求右端点的二分算法

4.总结


1.概论

要想了解什么是二分算法,我们就要知道什么是二分算法,二分算法是根据数组的规律,每次查找的数据原来的效率可能要O(n),而我们可以把它优化为logN,这会大大提高我们的算法效率,总的来说我们的二分算法就是通过利用数组的规律来优化效率的一种算法下面我们把二分算法进行分类:1.朴素的二分算法。2.查找左端点的二分算法。3.查找右端点的二分算法。

下面我们遵循从简到难得规律来进行讲解,帮助大家和我一起来认识二分算法。

2.朴素的二分算法

我们空说的话比较抽象,我们直接借助题目来认识二分算法。

力扣704二分查找正好合适。

看到题目,让我们在数组中让我们去找一个目标值,我们很容易想到遍历数组,找到targe进行返回,但是它遍历数组时间复杂度较高,我们发现我们没有利用数组有序的规律,所以我们进行算法优化,我们每次求中间的值,让它跟target进行比较,等于返回找到,小的话让left=mid+1,大的话让right=mid-1.我们观察这个算法我们发现我们每次都会干掉一半的值,时间复杂度会优化到LOGN,这时候有同学就要问了:主播主播,为什么我们每次找中点呢?不能每次找三分之一点,四分之一点,五分之一点吗?当然可以,只是经过数学大牛的计算证明,发现每次求中点的效率最高,所以我们这里只需要记住我们一般每次干掉一半即可。

下面给出我们的代码实现:

int search(vector<int>& nums, int target) {int left=0;int right=nums.size()-1;while(left<=right){int mid=left+(right-left)/2;if(nums[mid]>target){right=mid-1;}else if(nums[mid]<target){left=mid+1;}else return mid;}return -1;}

3.求左端点的二分算法和求右端点的二分算法

下面我们再来一道题目,来讲解我们的二分算法的进阶。

这道题我们发现它让我们求一个范围,所以我们需要求出左右的范围,这里我们就要进行分析了,怎么样求呢?

经过这道题目的分析,我们也是很容易想到的暴力解法就是遍历数组进行求解,时间复杂度同样达到了O(n),那么我们接下来进行算法优化,抽象出来数组,主播的字比较难看,凑合着看吧。。。

我们发现我们求出最左节点我们就是要求大于等于的最左节点,注意我们只能求它们边界的节点,这决定了我们必须得这样划分数组。

举个反例:

我们这里只能求小于等于的最右点解,求不出小于等于中小框范围的最左节点,这是我们算法导致的。硬求的话会导致效率降低,所以我们这样划分数组。不信我们进行求,就知道为什么不行了,

我们是这样求的,mid>t,right=mid-1;mid<=t,left=mid;我们发现right进入小框的范围后,变的就只有left了,我们left不断的等于mid,会不断向右靠,讲到这里各位靓仔应该明白了吧。

所以我们进行这样的范围划分是右意义的。

还有要注意的细节这里我们当left==right之后我们结束循环,因为如果有符合范围的值,我们一般是left和right移动到同一个为止上。

第二个要注意的点就是当出现偶数的特殊情况是我们怎么解决:

我们这里对mid的处理就不同了,如果mid=left+(right-left),它是指向偶数数组中间的靠左边,这里我们发现求最左节点靠右是正常的。但是相反当mid=left+(right-left+1)/2,mid指向right,就会出现问题,因为我们mid<target,left=mid+1;left向右靠,right=mid,right向左靠,right一直等于mid,陷入死循环,所以程序崩掉了。

我们总的来说我们根据划分来确定mid怎么搞是>t,<=t的组合,还是>=t,<t的组合,

这样的情况下我们就是前者的组合,

这样的组合我们就是后者的组合

,至于求最右端点的解法,我们对求最左节点的方法反过来就可了。

下面给出本题代码题解供大家理解:

    vector<int> searchRange(vector<int>& nums, int target) {int left=0;vector<int>num;int right=nums.size()-1;while(left<right){int mid=left+(right-left)/2;if(nums[mid]<target){left=mid+1;}else{right=mid;}}if(nums.size()!=0&&nums[left]==target){num.push_back(left);}else{num.push_back(-1);}right=nums.size()-1;while(left<right){int mid=left+(right-left+1)/2;if(nums[mid]>target){right=mid-1;}else{left=mid;}}if(nums.size()!=0&&nums[left]==target){num.push_back(left);}else{num.push_back(-1);}return num;}

4.总结

要想理解二分算法,需要自己画图去理解试错,总的来说注意一下细节就可以。希望大家都可以学会这种效率算法。

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

相关文章:

  • 推广服务商是什么意思南昌seo优化
  • 目前有哪些网络营销方式seo博客是什么意思
  • 怎么把网站管理系统seo域名综合查询
  • 福州有什么做网站的公司百度收录排名
  • wordpress和node.js宁波seo教学
  • 京东云wordpress后台十堰seo
  • 什么网站可以做网站竞价推广的企业
  • 武汉建设网信息网站seo查询官网
  • 国外免费网站服务器链接推广怎么做
  • 做蛋糕比较火的网站友链外链app
  • 江西宜春市建设局网站高端网站建设企业
  • 班级建设怎样建立班级网站免费网站推广网站在线
  • 做PPT的网站canva百度推广方案怎么写
  • 南通建设工程信息网官网seo是广告投放吗
  • 常州市教育基本建设与装备管理中心网站seo网站关键词优化工具
  • 十堰市茅箭区建设局网站百度大数据预测平台
  • 有关网站建设的电子商务论文百度网盘客服电话24小时
  • 建盏产业品牌上海seo推广
  • 家具网站素材创建自己的网站怎么弄
  • 深圳最专业的高端网站建设网页做推广
  • 常德做网站惠州网站建设
  • 网站文字代码教育培训机构前十名
  • 网站建设要实现的目标专业外贸网络推广
  • 网站站长是什么意思怎么做百度网页推广
  • 网站首页界面设计珠海网站建设制作
  • 济南快速建站模板网站优化工具
  • 西安市城乡建设管理局网站6江北关键词优化排名seo
  • 建设大厦网站seo详细教程
  • 溧水城市建设招标网站关键词提取
  • 沈阳网站建设蓝顶网络排名软件