《二分查找》(一)-入门

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

文章总体出自博主英雄出自哪里的5点直播
英雄出自哪里


一、二分查找本质是什么?

对于一个单调函数y=f(x)而言,已知一个y,如何得到一个x?
这便是二分查找要干的事!当一个数组元素的值已知的情况下,如何求数组下标;
也就是x = f(-1)(y);即反函数的概念!

二、二分查找的原理

1.原理

对于单调函数f(x)而言的:
找到值为y1的自变量x1的值;
一开始有两个游标left 和 right分别指向函数的定义域的两个端点,也就是[left, right]这个区间 y=f(x)的取值范围。
而后取定义域的中点 mid = (left + right)/2;
分三种情况讨论
(1)f(mid) == f1,则直接返回mid;
(2)f(mid) > f1,则要查找的f1,一定在mid的左边;
(3)f(mid) < f1,则要查找的f1,一定在mid的右边
于是转化成求更小子区间上的同样问题!(有递归的感觉了)

三、二分查找的实现

我们把这件事抽象出来,用一个函数binarySearch(arr, l, r)来表示在数组arr的区间 [l,r] 上找值为y1的下标,如果没找到则返回-1.

int f(int *arr, int x) {
    return arr[x];
}

int binarySearch(int *arr, int l, int r, int v) {
    if(l > r) {
        return -1;                              // (1)
    }
    if(l == r) {
        return arr[l] == v ? l : -1;            // (2)
    }
    int mid = (l + r) >> 1;                     // (3)
    int fv = f(arr, mid);                       // (4)
    if(fv < v) {
        return binarySearch(arr, mid+1, r, v);  // (5)
    }else if(fv > v) {
    	return binarySearch(arr, l, mid-1, v);  // (6)
    }
    return mid;                                 // (7)
}

截自-英雄出自哪里
代码与图来自 “英雄出自哪里” 英雄哥csdn链接

总结

leetcode 二分查找简单算法题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值