首页 > 其他分享 >二分查找

二分查找

时间:2024-07-19 22:28:59浏览次数:13  
标签:二分 right target nums int mid 查找 left

二分查找是很经典的算法了,写的时候虽然写对了,后面看了文章才知道细节还是蛮多的。
像target所在的区间,有[left,right]和[left,right)两种写法,会极大的影响边界处理条件。实质就在于我们需要在定义的区间内对target进行搜索,而不能有任何遗漏。后面的处理要和前面的区间范围配合。

逻辑还是简单的,根据书做一个总结,以[left,right]为例

  1. 首先确定搜索终止条件。这种区间定义时,需要考虑left==right,因此使用while(left<=right)(这其实就是在确定当left=right时也是区间定义的搜索空间,保证搜索空间的合法性)。同时定义right=nums.size()-1,这就保证了搜索空间都在定义区间中

  2. 后续处理边界时更新左右边界时使用left = mid + 1 和right = mid + 1,这一方面是因为原来的mid已经搜索过了,不需要重复搜索。同时因为是双闭区间的写法,也能保证后续的所有空间被搜索到。

而当[left,right)时

  1. 终止条件为left<right,同时right=nums.size(),保证不遗漏搜索
  2. 处理边界时,left = mid + 1不变,right需要修改为right = mid,这也是很显然的,虽然mid已经搜索过了,但是下一步的搜索空间是不包含right的,如果我们让right = mid - 1,就相当于忽略了这一个元素.
    最后给出代码

//[left,right],
//这里使用 vector::size_type会在大小为1的数组上报错,同样去vscode上面也会报错,提示超出内存
//[left,right]
class Solution {
public:
int search(vector& nums, int target) {
int left = 0, right = nums.size() - 1 ;
while (left <= right ){
int mid = (left + right) / 2;
if (nums[mid] < target){
left = mid + 1;
} else if (nums[mid] > target ){
right = mid - 1;
} else {
return mid;
}
}
return -1;
}
};
//[left,right)
class Solution {
public:
int search(vector& nums, int target) {
vector::size_type left = 0, right = nums.size() ;
while (left < right ){
vector::size_type mid = (left + right) / 2;
if (nums[mid] < target){
left = mid + 1;
} else if (nums[mid] > target ){
right = mid ;
} else {
return mid;
}
}
return -1;
}
};

标签:二分,right,target,nums,int,mid,查找,left
From: https://www.cnblogs.com/gqzz/p/18312493

相关文章

  • 整体二分学习笔记
    整体二分一般适用于解决可以若干次二分解决的问题,当进行若干次二分的复杂度无法接受时,就可以使用整体二分。可以使用整体二分解决的题目需要满足以下性质:1.询问的答案具有可二分性2.修改对判定答案的贡献互相独立,修改之间互不影响效果3.修改如果对判定答案有贡献,则贡献为一......
  • 造海船(二分基础)
    描述明朝郑和下西洋,需要建造庞大的海船,需要足够的木料,因为那时候没有钢铁制造的船,现在有n根原木,现在想把这些木头切割成k段长度均为l的小段木头(木头有可能有剩余),用来制造船的部件。当然,工匠希望得到的小段木头越长越好,这样可以让船更大一些不浪费木料,请求出l的最大值......
  • 从零开始学Java(超详细韩顺平老师笔记梳理)05——数组(语法,赋值机制,拷贝反转)、排序(冒泡排
    文章目录前言一、数组1.基础语法1)介绍2)使用(动态、静态初始化语法与使用)3)注意事项和细节2.数组赋值机制(ArryAssign)3.数组拷贝4.数组反转(reserve)5.数组的扩容与缩减二、排序三、查找四、二维数组(TwoDimensionalArry)1.快速入门2.使用3.案例:打印一个10行的......
  • VS快速全局查找Unity死循环代码
    1、编写一个死循环方法,然后运行调试vsusingUnityEngine;publicclassDeadLoop:MonoBehaviour{//StartiscalledbeforethefirstframeupdatevoidStart(){DeadLoopMethod();}voidDeadLoopMethod(){while(t......
  • 无权二分图的最大匹配
    原作者:https://blog.csdn.net/KYJL888/article/details/1060559421.二分图的基本知识点二分图:简单来说图中的点可以被分为两组,并且使得所有边都跨越组的边界,这就是一个二分图。准确来说:把一个图的顶点划分为两个不相交集U和V,使得每一条边都分别连接U和V中的顶点。如果存在这样的......
  • 20240718二分图
    一.基础概念1.定义:如果一个图的所有顶点可以被分成两个集合U和V,使得每条边连接的两个顶点都分别属于两个不同的集合,那么这个图就是一个二分图(BipartiteGraph)。2.性质:每个偶环都是二分图如果一个二分图中存在奇环,则它不是二分图。二.霍尔定理前言:在hloj上有这个内容,不知......
  • 代码随想录二刷复习(二分法)
    二分法模板:1:左闭右闭区间写法第一种写法,我们定义target是在一个在左闭右闭的区间里,也就是[left,right](这个很重要非常重要)。区间的定义这就决定了二分法的代码应该如何写,因为定义target在[left,right]区间,所以有如下两点:while(left<=right)要使用<=,因为left==rig......
  • 查找时间序列数据中异常值的终极指南(第 1 部分)
    时间序列分析中异常值检测的有效统计方法和工具   异常值:这些令人困扰的数据点可能会扭曲统计模型、扭曲预测并破坏决策过程。    雲闪世界专门介绍时间序列数据中异常值的识别和管理的四部分系列文章的开篇,我们将探索视觉和统计方法来有效识别时间序列数据中的......
  • day1 二分查找(及其进阶)和移除元素的双指针法
    基础概念算法的单调性:问题的规模随着算法的推进不断缩减(如704中开始的查找区间是[lo,hi),随着循环的进行,问题规模确实在不断的缩小)算法的不变性:在初始状态下自然满足,当问题的有效规模缩减为0时,不变性应该随即等于正确性。(如704中开始的查找区间是[lo,hi),最终要么直接命中,要么......
  • 二分图相关
    %\(\rm\color{red}{L}\color{black}{BY}\)学长。0.定义:二分图:二分图是一张图\(G=(V,E)\),其中点集\(V\)可以分成两个部分\((V1,V2)\),满足\(V1\capV2=\emptyset,V1\cupV2=V\),且\(V1,V2\)中均没有边,即对于\(\foralle\inE,e=(v_i,v_j)\),均有\(......