题解 | #二分查找-I#

二分查找-I

https://www.nowcoder.com/practice/d3df40bd23594118b57554129cadf47b

二分作为一个最为普通且需要我们具备的简单算法
无论在何时何地都有许多的妙用,可以和许许多多的算法加以结合~~~~
而且有衍伸的二分,三分等等.....
首先要明白:
二分的本质是二段性不是单调性。。。。
当想找不满足性质的边界值(红***域的右边界值)
二分左区间的右端点
  1. 找中间值 mid = (l+r+1)/2
  2. if(check(mid))等于true或者是false
  3. check(m)是检查m是在不满足性质的区间(检查是不是在红***间),更新l或者r
二分右区间的左端点
归结上面的两种二分方法,步骤为:

  1. 先写一个check函数
  2. 判定在check的情况下(true和false的情况下),如何更新区间。
  3. 在check(m)==true的分支下是:
            l=mid的情况,中间点的更新方式是m=(l+r+1)/2
            r=mid的情况,中间点的更新方式是m=(l+r)/2
这种方法保证了:
1. 最后的l==r
2. 搜索到达的答案是闭区间的,即a[l]是满足check()条件的。

//#define judge
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 10;
int n, q, k;
int a[maxn];
int main() {
#ifndef judge
  freopen("in.txt", "r", stdin);
  freopen("out.txt", "w", stdout);
#endif
  scanf("%d%d", &n, &q);
  for (int i = 0; i < n; i++) {
    scanf("%d", &a[i]);
  }
  for (int i = 0; i < q; i++) {
    scanf("%d", &k);
    int l = 0, r = n - 1;
    while (l < r) {
      int mid = l + r >> 1;
      if (a[mid] >= k) {
        r = mid;  //第二种情况 找绿***间的左端点
      } else {
        l = mid + 1;
      }
    }
    if (a[l] != k) {
      printf("-1 -1\n");
    } else {
      printf("%d ", l);
      l = 0, r = n - 1;
      while (l < r) {
        int mid = l + r + 1 >> 1;
        if (a[mid] <= k) {//第一种情况 找红***间的右端点
          l = mid;
        } else {
          r = mid - 1;
        }
      }
      printf("%d\n",l);
    }
  }
  return 0;
}



#算法题#
全部评论

相关推荐

AFBUFYGRFHJLP:直接去美帝试试看全奖phd吧
点赞 评论 收藏
分享
评论
3
2
分享
正在热议
# 25届秋招总结 #
440577次浏览 4493人参与
# 春招别灰心,我们一人来一句鼓励 #
41484次浏览 524人参与
# 阿里云管培生offer #
119865次浏览 2219人参与
# 地方国企笔面经互助 #
7928次浏览 18人参与
# 同bg的你秋招战况如何? #
75577次浏览 552人参与
# 虾皮求职进展汇总 #
114215次浏览 884人参与
# 北方华创开奖 #
107311次浏览 599人参与
# 实习,投递多份简历没人回复怎么办 #
2454001次浏览 34848人参与
# 实习必须要去大厂吗? #
55678次浏览 960人参与
# 提前批简历挂麻了怎么办 #
149825次浏览 1977人参与
# 投递实习岗位前的准备 #
1195707次浏览 18546人参与
# 你投递的公司有几家约面了? #
33180次浏览 188人参与
# 双非本科求职如何逆袭 #
661910次浏览 7394人参与
# 如果公司给你放一天假,你会怎么度过? #
4730次浏览 55人参与
# 机械人春招想让哪家公司来捞你? #
157604次浏览 2267人参与
# 如果你有一天可以担任公司的CEO,你会做哪三件事? #
11365次浏览 270人参与
# 发工资后,你做的第一件事是什么 #
12418次浏览 61人参与
# 工作中,努力重要还是选择重要? #
35612次浏览 384人参与
# 参加完秋招的机械人,还参加春招吗? #
20091次浏览 240人参与
# 我的上岸简历长这样 #
451924次浏览 8088人参与
# 实习想申请秋招offer,能不能argue薪资 #
39235次浏览 314人参与
# 非技术岗是怎么找实习的 #
155850次浏览 2120人参与
牛客网
牛客企业服务