当前位置: 首页 > news >正文

【算法——二分查找】

理论基础:

程序员面试经典题,二分搜索一个区间,区间查找 (LeetCode 34)_哔哩哔哩_bilibili

手把手带你撕出正确的二分法 | 二分查找法 | 二分搜索法 | LeetCode:704. 二分查找_哔哩哔哩_bilibili

这个是红蓝法,很牛:二分查找为什么总是写错?_哔哩哔哩_bilibili

在二分查找中,计算中间位置使用mid = left + (right - left) / 2而不是mid = (left + right) / 2主要是为了避免整数溢出的问题。

此类型题目多样总结:

34. 在排序数组中查找元素的第一个和最后一个位置

因为二分无法查到起止位置;所以用两次二分,一次左边界,一次右边界;

会不会漏查问题:比如left左边会不会还有target

#include<iostream>
using namespace std;
#include<vector>
int main()
{vector<int>nums = { 2,2 };int target = 3;int l = -1, r = nums.size();while (l + 1 != r)    //找第一个target{int m = l + (r - l) / 2;if (nums[m] < target) l = m;else r = m;}if (r >= nums.size() || nums[r] != target) return -1;cout << "l:" << l << "  r:" << r << endl;      //r就是第一个targetl = -1; r = nums.size();while (l + 1 != r)  //找最后一个target{int m = l + (r - l) / 2;if (nums[m] <= target) l = m;else r = m;}cout << "l:" << l << "  r:" << r << endl;      //l就是最后一个targetreturn 0;
}

35. 搜索插入位置

#include<iostream>
using namespace std;
#include<vector>
int main()
{vector<int>nums = { 1,3,5,6 };int l = -1, r = nums.size();int target = 7;while (l + 1 != r){int m = l + (r - l) / 2;if (nums[m] >= target) r = m;   //核心else l = m;}cout << r;return 0;
}

69. x 的平方根 


http://www.mrgr.cn/news/31761.html

相关文章:

  • 500元以内头戴式耳机哪款好?盘点500元以内百元宝藏品牌机型推荐
  • 系统架构设计师 - 案例特训专题 - 软件工程篇
  • Leetcode Hot 100刷题记录 -Day18(反转链表)
  • MongoDB在Linux系统中的安装与配置指南
  • 搜索引擎onesearch3实现解释和升级到Elasticsearch v8系列(一)-概述
  • sourceTree使用脚本一键push代码到gerrit
  • Python使用总结之FastAPI高级功能探索:数据库集成与依赖注入
  • Redis使用场景 | 建议收藏✨
  • BCT 预估block change tracking file的大小
  • 系统分析与设计
  • 【服务器第二期】mobaxterm软件下载及连接
  • C#中DataGridView 的 CellPainting 事件的e.Handled = true
  • C++速通LeetCode中等第16题-环形链表II(快慢指针)
  • Linux笔记---简单指令
  • 前端框架Vue、React、Angular、Svelte对比
  • 写作练习(一)
  • 2024年华为杯中国研究生数学建模竞赛F题(X射线脉冲星光子到达时间建模)思路
  • 为什么Redis这么快及可以实现的功能
  • 大厂校招:希音(Shein)校园招聘面试题及参考答案
  • JavaEE: 深入探索TCP网络编程的奇妙世界(二)