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

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

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

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

相关推荐
张张123y23 分钟前
后端第十四课:Agent 记忆系统(让 Agent 记住上下文和用户,跨会话不健忘)
java·大数据·人工智能·python·agent·记忆
阿里嘎多学长5 小时前
2026-10-20 GitHub 热点项目精选
开发语言·程序员·github·代码托管
曹牧5 小时前
C#:空合并运算符
java·前端·数据库
布吉岛的石头5 小时前
Java 程序员第 50 阶段2:预训练的目标函数:自回归语言建模本质
java·开发语言·人工智能·深度学习·回归·transformer
golang学习记5 小时前
IDEA 2026年的玩法已经完全不同
java·ide·intellij-idea
小羊没烦恼!6 小时前
铁道部新客票系统设计(二)
开发语言·前端·数据库·python·oracle·c#·php
紧跟先前的步伐6 小时前
Go AI Agent 实战 05|Temperature 与生成参数:让模型输出可控
java·人工智能·golang
金銀銅鐵6 小时前
[Java] 展示添加元素时 ArrayList 的内部变化
java·后端·ai编程
斌糖雪梨6 小时前
spring auth 核心流程详解
java·后端·spring
quantdash_cc6 小时前
从实时行情到价格观察表:用 Python 和 Pandas 构建策略输入数据
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash