leetcode 704 二分查找

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

示例 1:
输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4

示例 2:
输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1

文章目录

  • leetcode 704 二分查找
  • 二分法:方法一
  • 二分法:方法二

二分法:方法一

这道题是二分查找里面最简单的一道题,我们可以从简单入手,看while循环里的条件到底怎么写,到底要不要=,以及right=mid还是right=mid-1等等。
建议方法一和方法二对照着看。

public int search(int[] nums, int target) {int left=0;int right=nums.length;//二分查找索引范围[left,right)//这边条件很重要,当left==right时,退出循环;为什么不写<=?//因为上面的索引范围是在[left,right),right是不包括的,如果<=,//那么left==right是满足循环条件的,但是下面nums[mid]必定会数组//角标越界,所以这边循环条件只能写<。while(left<right){  int mid=(left+right)>>1;if(nums[mid]==target){return mid;}else if(nums[mid]>target){//因为nums[mid]>target,right=mid;有人要问right=mid-1//行不行,不可以,因为mid-1很可能就是答案,上面的索引范围是//[left,right),right是不包括的,所以这边只能是right=mid。//写成right=mid-1,就相当于索引范围是[left,right],//左右都包括了,和一开始的条件不一致。right=mid;}else{left=mid+1;}}//即left==right,退出循环;right索引是不包括的,//left==right说明没有查找到,返回-1;return -1;}

二分法:方法二

public int search(int[] nums, int target) {int left=0;//和方法一的不同处,索引范围是[left,right]int right=nums.length-1;//这边退出循环的条件是left>right;通俗点讲就是left==right是程序的最后一次循环。//方法一不是这样的。方法一是当left==right就会退出循环。//为什么会这样?是因为初始化索引范围不同造成的。while(left<=right){int mid=(left+right)>>1;if(nums[mid]==target){return mid;}else if(nums[mid]>target){//因为nums[mid]>target,所以right=mid-1,注意这边不是//right=mid,因为nums[mid]已经不符合条件了,为了和初始化//索引范围一致,即[left,right],这边需要写成right=mid-1,//因为mid-1很可能就是答案,但是mid绝不可能是答案。right=mid-1;}else{//left和上面的right同理left=mid+1;}}//当left>right,退出循环return -1;}

1、leetcode704 二分查找*相关推荐

  1. LeetCode--704.二分查找(C++)

    力扣链接 数组在内存中的空间地址是连续的 // // Created by lwj on 2022-03-30. // #include <iostream>using namespace ...

  2. 代码随想录Day01 | LeetCode704.二分查找、LeetCode27.移除元素

    数组理论基础 数组是存放在连续内存空间上的相同类型数据的集合. 数组可以方便的通过下标索引的方式获取到下标下对应的数据 需要两点注意的是 数组下标都是从0开始的. 数组内存空间的地址是连续的 正是因为 ...

  3. 【LeetCode-704 | 二分查找】

    #include <iostream> #include <vector> #include <queue> #include <stack> #inc ...

  4. leetcode704. 二分查找

    给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1. 示例 1: 输入: num ...

  5. 代码随想录Day01:数组理论基础、二分查找、移除元素

    目录 数组理论基础.二分查找.移除元素 1.数组理论基础 2.Leetcode704.二分查找 方法一 左闭右闭: 方法二 左闭右开: 方法三 左开右开: 方法四 左开右闭: 3.Leetcode27 ...

  6. 17道题带你理解二分查找

    不太会的可以先看看二分查找的模板 点这里 最需要注意的是二分查找的分界线并不止局限于大于等于小于,而是对某种性质的一种分界 1.Leetcode704. 二分查找 class Solution {pu ...

  7. 二分查找算法的万能公式(LeetCode35、704、1095)

    二分查找常常用于有序数组的查找操作.当然如果是一个问题,数组的顺序满足特定条件(不仅仅是升序或者降序,也可以是先升后降或先降后升),就可以通过逐步排查,缩小问题的规模的方式找到,这种算法也是二分查找算 ...

  8. 算法图解/二分查找/简单查找/选择排序/递归算法/快速排序算法/

    大 O 表示法 大 O 表示法在讨论运行时间时,log 指的都是 log2 大 O 表示法指出了算法有多快,让你能够比较操作数,它指出了算法运行时间的增速,而并非以秒为单位的速度. 大 O 表示法指出 ...

  9. LeetCode简单题之二分查找

    题目 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1. 示例 1: 输入: n ...

最新文章

  1. Maven-环境配置
  2. 服务器间无密码scp
  3. 第一章 自定义MVC框架
  4. android 数组赋值字符串_C语言奇淫技巧,字符串的三种表示方法,不会用不是合格的程序员...
  5. java设计模式观察者模式_Java设计模式(9)——观察者模式
  6. 卡通角色表情驱动系列二
  7. JS_13原型与原型链
  8. jfinal html5,Jfinal框架整合webSocket技术功能实现
  9. C++ 返回当前类名
  10. python百度百科-python语言是由哪个人创造的
  11. tab切换之图片切换
  12. 校验EXE文件防止软件被破解
  13. 光纤交换机 序列号_cisco查看光模块型号序列号命令
  14. macos双系统 wintogo_aigo固态硬盘,轻松实现macOS运行Windows双系统
  15. HDU6438 Buy and Resell
  16. kingbase之时间日期加减
  17. 【Verilog】FPGA驱动WS2812B点阵
  18. 此次告别ed2k链接文件下载烦恼
  19. 简单有效的多标准中文分词详解
  20. java中oops是什么意思_什么是oop思想_什么是OOPS

热门文章

  1. java 大小相间排序_ArrayList实现根据某属性大小相间排序
  2. c语言反编译_Gacrux:基于C语言的可自定义PE加载恶意软件
  3. 9中继器添加一列序号自增_三个动态自动更新EXCEL序号的小技巧,解决重复编号困扰...
  4. 用jk触发器构成二分频电路_深入了解数字电路之时序电路
  5. 网络安全比赛理论答题(六)
  6. Python基础教程:type()函数-动态创建类
  7. Python apply函数
  8. Python教程:Sys 与 Import 模块
  9. Python使用redis的消息队列
  10. python 输出所有大小写字母, range()以及列表切片