你真的会二分法吗?

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. 树与图的DFS与BFS

    树的DFS 题目:https://www.acwing.com/problem/content/848/  代 […]...

  2. [LeetCode解题报告] 502. IPO

    题目描述 假设 LeetCode 即将开始其 IPO。为了以更高的价格将股票卖给风险投资公司,LeetCode […]...

  3. 【链接 1】与静态链接库链接

    本文内容基于《CSAPP》第7章,只是符号解析的一部分,从使用的角度阐述了静态库的由来和使用,仅仅是个人见解, […]...

  4. 【图机器学习】cs224w Lecture 10 – PageRank

    Stanford cs224w 课程笔记:Google 赖以发家的 PageRank 算法的本质可视为 ran […]...

  5. 算法8 五大查找之:二叉排序树(BSTree)

    上一篇总结了索引查找,这一篇要总结的是二叉排序树,又称为二叉搜索树(BSTree) 。 构造一棵二叉排序树的目 […]...

  6. Codeforces 1365D Solve The Maze

    题目大意: 在一个 \(n * m\) 的矩阵中,有空地、坏人、好人和墙。你可以将空地变成墙来堵住坏人。\(( […]...

  7. 线性同余发生器与伪随机数

    本文旨在简单探索线性同余发生器的一些原理和特点,很多思路借鉴于TAOCP,如果想要深入的探索这方面的知识,建议 […]...

  8. 实战算法——多叉树全路径遍历

    多叉树全路径遍历 本文为原创作品,首发于微信公众号:【坂本先生】,如需转载请在文首明显位置标明“转载于微信公众 […]...

随机推荐

  1. OkHttp 优雅封装 OkHttps 之 回调线程魔变

    第一篇:OkHttp 优雅封装 HttpUtils 之 气海雪山初探 第二篇:OkHttp 优雅封装 Http […]...

  2. 前端框架

    最近需要一些前端框架,于是在网上整理了一些感觉不错的前端框架,有pc端和移动端,为了方便日后自己先记录下来了& […]...

  3. MindTouch简介和技术架构

    原文:http://www.xiezuo8.net/?p=6  摘要: 介绍MindTouch公司的企业级协作 […]...

  4. 富文本 编辑器

    富文本 编辑器 前天想尝试做一个功能简单,但是好看的在线记事本。目前是用RoR+Mysql+Jquery+Bo […]...

  5. Java内存分配及垃圾回收算法(hotspot虚拟机)

    一、运行时内存分配 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。 这 […]...

  6. 计量经济学导论13:虚拟变量与双重差分

    这一章笔记围绕虚拟变量问题展开,主要介绍虚拟变量的引入形式和分析方法,重点介绍双重差分模型的应用方法。 目录 […]...

  7. Hadoop_FileInputFormat分片

    Hadoop学习笔记总结系列5——获取分片信息介绍,以及为何Hadoop不适合处理小文件 Hadoop学习笔记 […]...

  8. LNMP安装了哪些软件?安装目录在哪?

    LNMP一键安装包除去安装所必须的依赖包,还会默认安装以下软件: Nginx、MySQL/MariaDB、PH […]...

展开目录

目录导航