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

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

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

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

相关推荐
plainGeekDev25 分钟前
ButterKnife → ViewBinding
android·java·kotlin
CSharp精选营15 小时前
关系型 vs 非关系型:从原理到选型,一文搞定数据库核心分类
数据结构·nosql·关系型数据库·非关系型数据库·技术选型
像我这样帅的人丶你还16 小时前
Java 后端详解(四):分页与搜索
java·javascript·后端
她的男孩16 小时前
数据权限为什么不能只靠注解?Forge 的 Mapper 层 SQL 改写源码拆解
java·后端·架构
tntxia17 小时前
Mybatis的日志输入
java
亦暖筑序19 小时前
Java 8老系统Browser Agent实战:三层拦截把AI操作后台变成可审计流程
java·后端·设计模式
用户298698530141 天前
Java 实现 Word 文档加密与权限解除
java·后端
Yeats_Liao1 天前
14:Servlet中的页面跳转-Java Web
java·后端·架构
未秃头的程序猿1 天前
告别"if-else地狱"!Java 21模式匹配,代码优雅了10倍
java·后端·面试
鹤望兰6751 天前
字节跳动国际支付-后端开发-三面面经
java