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

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

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

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

相关推荐
我喜欢山,也喜欢海12 小时前
Java和go在并发上的表现为什么不一样
java·python·golang
hhb_61812 小时前
PHP 8.x 核心特性与工程化开发实践指南
开发语言·php
geovindu13 小时前
go: Flyweight Pattern
开发语言·设计模式·golang·享元模式
Wenzar_13 小时前
**零信任架构下的微服务权限控制:用Go实现基于JWT的动态访问策略**在现代云原生环境中,
java·python·微服务·云原生·架构
xyq202414 小时前
TypeScript中的String类型详解
开发语言
lUie INGA20 小时前
在2023idea中如何创建SpringBoot
java·spring boot·后端
小糖学代码20 小时前
LLM系列:1.python入门:15.JSON 数据处理与操作
开发语言·python·json·aigc
handler0120 小时前
从源码到二进制:深度拆解 Linux 下 C 程序的编译与链接全流程
linux·c语言·开发语言·c++·笔记·学习
geBR OTTE20 小时前
SpringBoot中整合ONLYOFFICE在线编辑
java·spring boot·后端
Porunarufu20 小时前
博客系统UI自动化测试报告
java