前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >算法篇:二分查找基础篇

算法篇:二分查找基础篇

作者头像
灰子学技术
发布2020-08-28 10:52:55
4210
发布2020-08-28 10:52:55
举报
文章被收录于专栏:灰子学技术

算法:

代码语言:javascript
复制
目标Target:需要查找的值
索引index:要查找的当前位置
左右指示符Left,Right:用来维持查找的空间坐标
中间指示符Mid:用应用条件来确定我们应该向左查找还是向右查找的索引 
代码语言:javascript
复制
二分查询,步骤:
1.预处理过程(绝大部分是对未排序的数据进行排序)
2.二分查找过程(找到合适的循环条件,第一次将查找空间一分为二)
3.后处理过程(在剩余的空间中,找到合适的目标值)
代码语言:javascript
复制
模型:
1.初始条件:left=0,right=length-1
2.终止条件:left>right
3.向左查找:right = mid -1 
4.向右查找:left = mid+1
适用的题目:在递增递减区间中搜索目标值;
一般有三类:找特定值,
找大于特定的元素(上界),
找小于特定值的元素(下界)

题目1:二分查找

https://leetcode-cn.com/problems/binary-search/

代码实现:

代码语言:javascript
复制
func search(nums []int, target int) int {
  l,r := 0, len(nums)-1
  for l<=r {
      // 小技巧:这种方式等同于(l+r)/2,如此实现防止r+l超过int的最大值
      m := l+ (r-l)/2 
      if target == nums[m] {
          return m
      }
      if target > nums[m] {
          l = m+1
      } else {
          r = m-1
      }
  }
  return -1
}

执行结果:

题目2: 吃香蕉的珂珂

https://leetcode-cn.com/problems/koko-eating-bananas/

代码实现:

代码语言:javascript
复制
func minEatingSpeed(piles []int, H int) int {
    var max int 
    for _, p := range piles {
        if p > max {
            max = p
        }
    }
    left, right := 1, max
    for left < right {
        mid := left + (right - left)/2
        if isEnable(piles, mid, H) { // 表示吃的太慢了,需要让她吃的快一点
            left = mid +1
        } else { // 表示吃的太快了,需要让她慢点吃
            right = mid  
        }
    }
    return left 
}
func isEnable(piles []int, speed, H int) bool {
    sum := 0 
    for _,p:= range piles{
        sum += (p+speed-1)/speed
    }
    return sum>H
}
/*
算法:该问题转化为她按照最慢速度和最快速度之间,找到恰好时间==H的那个速度。
二分查找
*/

执行结果:

题目3:求平方根

https://leetcode-cn.com/problems/sqrtx/

代码实现:

代码语言:javascript
复制
func mySqrt(x int) int {
    if x==0 {
        return 0
    }
    
    left,right := 1,x/2
    
    for left<right { // [1,x/2]范围内都遍历结束,二分法就能找到这个平方根
        mid := (left + right + 1) >> 1
        squar := mid*mid
        if squar > x{ // 平方大于x,移动right到右中位数,平方根要在左侧
            right = mid-1
        } else { // 平方小于x,移动left到右中位数,平方根要在右侧
            left = mid
        }
    }
    return left
}
/*
平方根的求解算法:
可以转化成二分查找法,左边界是1,右边界是x/2.
判断条件是:平方根mid的平方>x,就向左偏移,小于x的话就往有偏移。
直到数字区间变成1的时候,就是这个平方根了。
*/

执行结果:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-08-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 灰子学技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档