你真的会二分法吗?

S-N-O-R-L-A-X 2021-07-30 原文


你真的会二分法吗?

前言:
二分法作为基础算法,几乎是每个程序员(甚至是非程序员都应该掌握的技能),然而,你真的完全了解二分法吗?二分法总体上有三种。不多说,直接上代码。

方法1

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

方法一特点:
直接比较mid与target
起始条件:left=0,right=nums.size()-1
循环条件:left<=right
向左缩小:left=mid-1
向右缩小:right=mid+1
循环结束时:left==right+1

方法二:

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

方法二特点:
比较mid+1位置上的元素与target
起始条件:left=0,right=nums.size()
循环条件:left<right
向左缩小:left=mid-1
向右缩小:right=mid
循环结束时:left==right

方法三

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

方法三特点:
比较mid-1,mid+1位置上的元素与target
起始条件:left=0,right=nums.size()-1
循环条件:left<right
向左缩小:left=mid
向右缩小:right=mid
循环结束时:left+1==right

总结:

比较方法 起始条件 循环条件 向左缩小 向右缩小 循环结束时
方法一 比较mid位置上的元素与target left=0,right=nums.size()-1 left<=right left=mid-1 right=mid+1 left==right+1
方法二 比较mid+1位置上的元素与target left=0,right=nums.size() left<right left=mid-1 right=mid left==right
方法三 比较mid-1,mid+1位置上的元素与target left=0,right=nums.size()-1 left<right left=mid right=mid left+1==right
发表于
2021-07-30 13:02 
$SNORLAX$ 
阅读(0
评论(0
编辑 
收藏 
举报

 

版权声明:本文为S-N-O-R-L-A-X原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/S-N-O-R-L-A-X/p/15079160.html

你真的会二分法吗?的更多相关文章

  1. 算法题丨3Sum

    描述 Given an array S of n integers, are there elements a […]...

  2. Java学习笔记 算法 Algorithms Fourth Edition

    标字符 字符串 字符 1.数字不能作为标识符的首字母 2.标识符不能有空格 3.严格区分大小写 4.不能是关键 […]...

  3. 推荐系统,深度论文剖析GBDT+LR

    今天我们来剖析一篇经典的论文:Practial Lessons from Predicting Clicks […]...

  4. 数据结构与算法(C/C++版)【栈与队列】

    第三章《栈与队列》 (一)栈简介  栈(Stack):只允许在一端进行插入或删除操作的线性表。首先栈是一种线性 […]...

  5. AtCoder Beginner Contest 121 题解

    题目链接:https://atcoder.jp/contests/abc121   A White Cells […]...

  6. google tensorflow bert代码分析

    参考网上博客阅读了bert的代码,记个笔记。代码是 bert_modeling.py 参考的博客地址: htt […]...

  7. Java基础系列–HashMap(JDK1.8)

    原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/1 […]...

  8. 【LEETCODE】32、LeetCode的第35题,查找插入的位置

    凉凉,看来想做好一个题还不容易啊。。。 有点难受。。。   1.看看题目吧 Given a sorted ar […]...

随机推荐

  1. linux查看和修改系统时间

    设置日期:date -s 20091112 设置时间:date -s 18:30:50   日期和时间一起设置 […]...

  2. powerdesigner 画ER图

    ER图 即为 CDM图 – Conceptual Data Modal CDM可以转换成PDM、O […]...

  3. js闭包

    先展示两段代码块看看到底有什么区别 function foo(x) { var tmp = 3; return […]...

  4. 程序员的4条忠告,你做到了几条

    给程序员初级者的忠告 热爱学习技术,一头埋进互联网这个行业,并且选择了 Java 这一条道路,很多人或多或少都 […]...

  5. Java 8的这些新特性,不一样的全新版本(万字长文详细说明)

    1995 年 5 月 23 日,Oak 语言改名为 Java,然后有了那句著名的口号——“Write Once […]...

  6. 斯坦福大学机器学习公开课

    寒假玩了大半了,把各种游戏给卸载了,正儿八经的学习啦。。。 一直想把这个公开课看完,上学的时候吧不想看,放假了 […]...

  7. jave 计算音视频时长

    File source = new File("视频.mp4"); Encoder encoder = new […]...

  8. iOS AppStore上架流程图文详解2021版 (上)

    到了2021年,虽然网上也有大牛写过很多IOS App上架流程资料,但随着苹果发布机制的微调有些已经过时了。我就趁着这次刚刚发布成功的鲜活经验,记录下来,做一下补充。1、首先得注册Apple Developer的开发者账号,最后如果要上架...

展开目录

目录导航