数据结构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;
}

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

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

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

相关推荐
念何架构之路8 小时前
Go语言常见并发模式
开发语言·后端·golang
磊 子8 小时前
多态类原理+四种类型转换+异常处理
开发语言·c++·算法
脆皮炸鸡7558 小时前
库制作与原理~动态链接
linux·开发语言·经验分享·笔记·学习方法
XMYX-08 小时前
26 - Go recover 捕获错误:优雅恢复的真正意义
开发语言·golang
小白学大数据8 小时前
基于大模型的Python智能爬虫:语义识别与数据清洗实践
开发语言·爬虫·python·数据分析
掉鱼的猫8 小时前
Spring AI 2.0 GA 倒计时:先别急,来看看 Java AI 框架的另一条路
java·openai·agent
Refrain_zc8 小时前
Android 应用内 APK 安装全方案:从静默安装到普通安装的详解
java
迷渡9 小时前
聊一聊 Bun 用 Rust 重写这件事
开发语言·后端·rust
古怪今人9 小时前
Gradle构建工具 Groovy/Kotlin DSL的现代化自动化构建工具
开发语言·kotlin·自动化