简单化写法解决二分

博客内容展示了如何使用二分查找算法找到不小于目标值的最左边的数字,以及等于目标值的最右边的数字。通过两种不同实现方式,讨论了左闭右开和左闭右闭边界条件的影响,并提供了与标准库`lower_bound`函数的比较。

简单化写法解决二分

找到不小于某个值的最左边的数字

#include <algorithm>
#include <iostream>
#include <vector>

using namespace std;

int bfind(
    vector<int>& data,
    int target) {  // 函数是在data中找到第一个不小于target的数,相当于lower_bound

  int l = 0;
  int r = data.size() - 1;
  int res = -1;
  // 所以这里维持着一个左闭右闭

  while (l <= r) {
    int mid = l + (r - l) / 2;
    if (data[mid] < target) {
      l = mid + 1;
    } else if (data[mid] >= target) {
      res = mid;
      r = mid - 1;
    }
  }
  return res;
}

int main() {
  vector<int> data = {5, 8, 8, 8, 8, 9, 13};

  cout << bfind(data, 8) << endl;

  auto iter = lower_bound(data.begin(), data.end(), 8);
  if (iter == data.end()) {
    cout << "not find" << endl;
    return 0;
  }
  cout << std::distance(data.begin(), iter) << endl;

  cout << *iter << endl;
}

#include <algorithm>
#include <iostream>
#include <vector>

using namespace std;

int bfind(
    vector<int>& data,
    int target) {  // 函数是在data中找到第一个不小于target的数,相当于lower_bound

  int l = 0;
  int r = data.size();
  int res = -1;
  // 所以这里维持着一个左闭右开

  while (l < r) {
    int mid = l + (r - l) / 2;
    if (data[mid] < target) {
      l = mid + 1;
    } else if (data[mid] >= target) {
      res = mid;
      r = mid;
    }
  }
  return res;
}

int main() {
  vector<int> data = {5, 8, 8, 8, 8, 9, 13};

  cout << bfind(data, 8) << endl;

  auto iter = lower_bound(data.begin(), data.end(), 8);
  if (iter == data.end()) {
    cout << "not find" << endl;
    return 0;
  }
  cout << std::distance(data.begin(), iter) << endl;

  cout << *iter << endl;
}

找到等于某个值的最右边的数字

int bfind(
    vector<int>& data,
    int target) {  

  int l = 0;
  int r = data.size();
  int res = -1;
  // 所以这里维持着一个左闭右开

  while (l < r) {
    int mid = l + (r - l) / 2;
    if (data[mid] < target) {
      l = mid + 1;
    } else if (data[mid] == target) {
      res = mid;
      l = mid + 1;
    }
    if (data[mid] > target) {
      r = mid;
    }
  }
  return res;
}

简单点直接加一个res,这个res的好处在于能够返回没有找到的情况,如果直接返回r或者l是不能处理没找到的情况

int bfind(
    vector<int>& data,
    int target) { 

  int l = 0;
  int r = data.size()-1;
  int res = -1;
  // 所以这里维持着一个左闭右闭

  while (l <= r) {
    int mid = l + (r - l) / 2;
    if (data[mid] < target) {
      l = mid + 1;
    } else if (data[mid] == target) {
      res = mid;
      l = mid + 1;
    }
    if (data[mid] > target) {
      r = mid-1;
    }
  }
  return res;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值