首页 > 其他分享 >LeetCode704.二分查找

LeetCode704.二分查找

时间:2023-09-08 21:01:11浏览次数:39  
标签:二分 right target LeetCode704 mid while 查找 左闭 left

二分查找

学习内容

二分查找是在一个数组里,找一个target,判断这个target在不在数组中,在的话就返回这个target所在数组的下标。

二分查找有两个误区:

  1. while的条件是小于还是小于等于-
  • while(left <= right)
  • while(left < right)
  1. if后执行的语句是=mid还是等于mid-1
if(num[mid] > target){
  right = middle
   or 
  right = middle - 1
}

解决这两个误区的方式是:明确区间的定义

看区间是左闭右闭(两边值都能取),还是左闭右开(只能取左边值),开始区间的定义,会影响到二分法的边界条件处理。

明确了区间定义后,接着就在while循环中坚持对区间条件的定义。

  1. 左闭右闭区间

因为数组长度的有效值是0到size-1,而右边可以取到,所有初始设right为size-1。

left = 0; right = size-1;
while(left <= right){
  mid = (left+right)/2
  if num[mid] > target{
考虑左闭右闭的定义,右边界的范围可以是mid,也可以是mid-1。但是为了每一轮都能筛出来值,所以设置为mid-1
    right = mid - 1
  } else if nums[mid]<target{
左边可以取到mid、也可以是mid+1,为了每一轮更精确取到边界值,设置为mid+1
    left = mid + 1
  }
  else: return mid
}
return -1
  1. 左闭右开区间

因为数组长度的有效值是0到size-1,而右边可以不能取到,所以初始设right为size。

left = 0; right = size;
while(left <= right){
  mid = (left+right)/2
  if num[mid] > target{
考虑左闭右开的定义,右边界的范围可以是mid、mid+1。但是为了每一轮都能筛出来值,所以设置为mid
    right = mid
  } else if nums[mid]<target{
左边可以取到mid、也可以是mid+1,为了每一轮更精确取到边界值,设置为mid+1
    left = mid + 1
  }
  else: return mid
}
return -1

代码

左闭右闭写法

func search(nums []int, target int) int {
    // 左闭右闭的写法
    var left, right = 0, len(nums)-1
    for left <= right {  
        mid := (left+right) / 2
        if nums[mid] > target {
            right = mid - 1
        } else if nums[mid] < target {
            left = mid + 1
        } else {
            return mid
        }
    } 
    return -1
}

go补充

for循环中多个变量的定义:

for i, j := 0, 0; i <= 5 && j <= 5; i, j = i+1, j-1 {
  t.Log("i: ", i)
  t.Log("j: ", j)
  sum += i + j
}

用for来代替while,初始变量在前面定义,for中写循环变量:

i := 0
for i < 5 {
  fmt.Println(i)
  i++
}

for中的变量用=,而不要用:=,不然会是局部变量,不改变for外面 的值。

参考:

  1. 【GoLang】GoLang for 中有多个循环变量怎么处理? https://www.cnblogs.com/junneyang/p/6072680.html
  2. 弈心:网络工程师的Golang之路 -- for循环、while循环 https://zhuanlan.zhihu.com/p/574235761

标签:二分,right,target,LeetCode704,mid,while,查找,左闭,left
From: https://blog.51cto.com/u_15955938/7412990

相关文章

  • 【IIS】HTTP 错误 405.0 - Method Not Allowed,无法显示您正在查找的页面,因为使用了无
    转自:https://blog.csdn.net/weixin_38211198/article/details/103597330问题HTTP 错误 405.0 - Method Not Allowed无法显示您正在查找的页面,因为使用了无效方法(HTTP 谓词)。 解决在IIS中,找到处理程序映射上面的报错已经指明是WebDAVModule模块,找到该模块  ......
  • 剑指 Offer 53 - I. 在排序数组中查找数字 I
    题目链接:剑指Offer53-I.在排序数组中查找数字I题目描述:统计一个数字在排序数组中出现的次数。解法思路:代码:简单遍历funcsearch(nums[]int,targetint)int{varresintn:=len(nums)ifn==0{returnres}for_,v:=range......
  • 9-8|如何查找一个目录下递归所有文件属性 是不是root:root
    要在一个目录下递归地查找所有文件并检查它们的所有者和组是否为`root:root`,您可以使用`find`命令结合`-user`和`-group`选项。例如,要在`/path/to/directory`目录下查找所有者和组都是`root`的文件和目录,您可以执行:```bashfind/path/to/directory-userroot-group......
  • 浅谈WQS二分
    WQS二分学习笔记目录WQS二分学习笔记用途:思考方式:使用限制:算法思想:用途:WQS二分通常用来解决形如强制选k个且收益最大/代价最小的题目。就比如说:https://www.luogu.com.cn/problem/P5308如果没有限制的话,代码会非常简单思考方式:使用限制:首先要使用WQS二分要有限制:便是最终k......
  • SQL查找所有数据表 主键
    SELECTt.nameasTableName,c.nameASColumnNameFROMsys.tablestLEFTOUTERJOINsys.columnscONt.object_id=c.object_idLEFTOUTERJOINsys.index_columnsicONic.object_id=c.object_idANDic.column_id=c.column_id......
  • 二分查找
    //1intbinarySearch(vector<int>&nums,inttarget){intleft=0;intright=nums.size()-1;while(left<=right){intmid=left+(right-left)/2;if(nums[mid]==target){//找......
  • 整体二分学习笔记
    有一些题目需要用到二分,但多次询问直接二分,会导致TLE,那么就需要用到一个离线算法,将多个询问放在一起二分,这就是整体二分。条件能够用整体二分解决的题目需要满足以下性质:1.题目具有可二分性(即单调性);2.修改对判定答案的贡献相互独立,修改之间互不影响效果。3.修改如果对判定答......
  • 使用 ONLYOFFICE 宏查找公司标识
    现在各种标识形形色色,要找到标识相关的参考可能有些麻烦,甚至可能让人迷惑。不过,您可以使用ONLYOFFICE宏,让这个过程自动执行。在这篇博文中,我们会向您展示如何创建一个宏,让它同时从外部API检索多种标识类型,并将它们插入到您的电子表格中。什么是ONLYOFFICE宏如果您是一名资深......
  • JavaScript--查找当前节点的父节点
    consttreeData=(item)=>{if(item.parent&&item.parent.length>0){let_parent=data.taskData.filter((data)=>data.id==item.parent);if(_parent&&_parent.length>0){if(da......
  • 二分的边界问题
    二分法的适用场景1.有单调性的题目一定可以二分2.没有单调性也有可能二分由此可见,二分的核心并不是单调性。核心是:定义了某种性质,使得可以将整个数据集一分为二,左半边满足一种性质,右半边不满足;右半边满足另一种性质,左半边不满足。则二分可以寻找左区间的边界,也可以寻找右区......