数据结构09(Java)-- 二分查找模板

前言: 其实我不想写具体的什么是二分查找? 这篇文章主要是针对要查找的值来看看代码, 因为我们不是每次都要找到目标值, 也有可能要找的数组中没有目标值

二分查找(binary search)是一种基于分治策略的高效搜索算法。它利用数据的有序性( 排序的数组必须有序 ),每轮缩小一半搜索范围,直至找到目标元素或搜索区间为空为止。

Question

给定一个长度为 n 的数组 nums ,元素按从小到大的顺序排列且不重复。请查找并返回元素 target 在该数组中的索引。若数组不包含该元素,则返回 -1.

1. 查找目标值是否存在

无重复 / 有重复都能用,但只返回任意一个匹配位置

java 复制代码
int find(vector<int>& nums, int target ) {
  int l = 0; r = nums.size()-1;
  while(l<=r){
    int l = 0, r = nums.size()-1;
    while(l<=r){
      int mid=l+(r-l)/2;
      if(nums[mid]==target) return mid;
      else if(nums[mid]<target) l=mid+1;
      else r=mid-1;
    }
    return -1;
  } 
}
2. 左边界(第一个 >= target / 重复最左 / 插入位置)

功能:

找第一个 ≥ target 的位置

重复元素 → 返回最左边那个

没找到 → 返回应该插入的位置

java 复制代码
int leftBound(vector<int>& nums, int target) {
    int l = 0, r = nums.size() - 1;
    int ans = nums.size(); // 默认插到末尾

    while (l <= r) {
        int mid = l + (r - l) / 2;
        if (nums[mid] >= target) {
            ans = mid;     // 记录答案
            r = mid - 1;   // 继续往左找更早的
        } else {
            l = mid + 1;   // 太小,去右边
        }
    }
    return ans;
}

作用:

找第一个 >= target

找重复元素最左边

找插入位置

找第一个大于 target(只需把 >= 改成 >)

三、右边界二分

功能:

找最后一个 ≤ target 的位置

重复元素 → 返回最右边那个

java 复制代码
int rightBound(vector<int>& nums, int target) {
    int l = 0, r = nums.size() - 1;
    int ans = -1;

    while (l <= r) {
        int mid = l + (r - l) / 2;
        if (nums[mid] <= target) {
            ans = mid;     // 记录答案
            l = mid + 1;   // 继续往右找更晚的
        } else {
            r = mid - 1;   // 太大,去左边
        }
    }
    return ans;
}

小白啊!!!写的不好轻喷啊🤯如果觉得写的不好,点个赞吧🤪(批评是我写作的动力)

...。。。。。。。。。。。...

...。。。。。。。。。。。...

相关推荐
zander2586 分钟前
114. 二叉树展开为链表
数据结构·链表·深度优先
雪碧透心凉_15 分钟前
while 循环与循环嵌套
开发语言·python
TDengine (老段)19 分钟前
TDengine 免费版说明
java·大数据·数据库·物联网·时序数据库·tdengine
乐观勇敢坚强的老彭21 分钟前
信奥C++一维数组笔记
开发语言·c++·笔记
码上有光23 分钟前
异常和智能指针
java·大数据·c++·servlet·异常·智能指针
这就是佬们吗29 分钟前
Python入门⑤-异常处理、文件操作与实战项目
开发语言·数据库·python·算法·pycharm
asdzx6741 分钟前
Python PDF 拆分实战指南:单页拆分与按需页码范围拆分
开发语言·python·pdf
孬甭_1 小时前
C++ vector
开发语言·c++
小肝一下1 小时前
3. 单链表
c语言·数据结构·c++·算法·leetcode·链表·dijkstra
学计算机的计算基1 小时前
操作系统内存管理全解:虚拟内存、页表、COW、malloc、OOM一篇搞定
java·笔记·算法