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

二分查找模板

时间:2024-07-15 15:54:57浏览次数:17  
标签:二分 right target middle 查找 数组 模板 left

二分查找主要难点在于边界判定,逻辑相对简单,下文以力扣704.二分查找为例分析二分查找的代码模板。

题目描述

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。 来源:力扣(LeetCode) 原题地址

问题分析

在有序数组中找到一个数,一般的思路是将整个数组遍历一遍,最坏的情况下时间复杂度为O(n),在一些数据量特别大的情况下会超时。此时我们可以用二分法进行查找————由于是有序数组,将数组中间的元素与需要找到的元素进行比较,便可判断需要查找的元素在数组的前半部分或者后半部分。接下来进行同样的操作,进一步缩小范围。这样下来时间复杂度为O(logn),大大减少。

实现思路

虽然二分法的思路简单,但实现起来并不容易。它的问题主要在边界判断上。接下是具体实现思路:

  1. 首先定义数组的左端点与右端点:left, right。

  2. 当left < right,也就是我们所确定的数组所包含的元素个数大于1时:

  3. 确定一个middle = (left + right) / 2(如果是python的话要用//)。

  4. 如果需要查找的target比middle大,说明target就在数组右半边,这时候我们可以更新左端点,使left = middle + 1,从而开始新一轮对右半边数组的查找。反之我们就要更新右端点,使right = middle。

    以下是具体实现代码:

    size = nums.size();
    int left = 0, right = size;
    bool flag = true;
    while (left < right)
    {
        int mid = (left + right) / 2;
        if (target > nums[mid]) left = mid + 1;
        else if (target < nums[mid]) right = mid;
        else cout << mid, flag = false;
    }
    if (flag) cout << -1;

    注意,这里我们使用的是左闭右开区间。middle已经判断过,不在target所在区间。因为右开,右端点right不会访问到,所以我们可以令right = middle。但由于左闭,左端点是可以被访问到的,所以我们要让left = middle + 1,在middle的基础上向左移动一位。

代码实现

二分查找 - AC代码

标签:二分,right,target,middle,查找,数组,模板,left
From: https://blog.csdn.net/m0_73456105/article/details/140436513

相关文章

  • 快速排序模板及其理解
    快速排序在面试中经常用于考察面试者的代码能力,以下是我个人对如何手撕快排的一些理解:原理:快速排序的解决分为两个部分,分区(partition)和递归(recurse)。分区是主要进行排序的功能,递归用于控制分区的次数。分区的思想是:选定一个数,将所有小于这个数的数组元素都放在它的左侧,同理......
  • Day33.元类下的属性查找
    1.元类下的属性查找_对象.方法和类名.方法的查找经过#todo属性查找的原则:对象->类->父类#todo切记:父类不是元类classMymeta(type):n=444def__call__(self,*args,**kwargs):#self=<class'__main__.StanfordTeacher'>obj=self.__new......
  • 网站源码软件公司pbootcms模板网页设计主题
    软件公司的网站设计分享我很高兴向大家介绍我刚刚制作的软件公司的网站设计。友好的站点界面,是打动访客的第一步。软件公司网站主题网站设计通常旨在展示公司的专业性、技术实力以及服务优势。以下是对软件公司网站主题设计的介绍,分为几个关键部分进行阐述:整体设计风格:简洁......
  • 网站源码机电设备pbootcms模板网页设计主题
    机电设备的网站设计分享我很高兴向大家介绍我刚刚制作的机电设备的网站设计。友好的站点界面,是打动访客的第一步。机电设备网站主题网站设计需要突出机电设备的专业性、技术实力以及公司形象。以下是对机电设备网站主题设计的详细介绍:1.整体设计风格专业与技术感:整体设计......
  • 最大流模板
    P3376【模板】网络最大流#include<bits/stdc++.h>#definefo(i,a,b)for(ll(i)=(a);(i)<=(b);(i)++)#definefd(i,b,a)for(ll(i)=(b);(i)>=(a);(i)--)#definelc(o<<1)#definerc((o<<1)|1)#definemk(x,y)make_pair((x),(y))#defineebempla......
  • 【模板】单源最短路径(弱化版)
    【模板】单源最短路径(弱化版)洛谷P3371题目背景本题测试数据为随机数据,在考试中可能会出现构造数据让SPFA不通过,如有需要请移步P4779。题目描述如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度。输入格式第一行包含三个整数......
  • 耍杂技的牛 模板
    题目: 农民约翰的 N 头奶牛(编号为 1..N)计划逃跑并加入马戏团,为此它们决定练习表演杂技。奶牛们不是非常有创意,只提出了一个杂技表演:叠罗汉,表演时,奶牛们站在彼此的身上,形成一个高高的垂直堆叠。奶牛们正在试图找到自己在这个堆叠中应该所处的位置顺序。这 N......
  • 基于uni-app与图鸟UI的知识付费小程序模板
    一、项目概述在知识经济蓬勃发展的背景下,移动互联网成为知识传播与消费的重要渠道。本项目旨在利用前沿的前端技术栈——uni-app及高效UI框架图鸟UI,打造一款集多功能于一体的、面向广大求知者的知识付费平台移动端模板。该模板旨在简化开发流程,加速产品迭代,同时确保卓越的用户......
  • 网站源码SEO公司pbootcms模板网页设计主题
    SEO公司的网站设计分享我很高兴向大家介绍我刚刚制作的SEO公司的网站设计。友好的站点界面,是打动访客的第一步。SEO公司网站主题网站设计旨在展示公司的专业能力、服务范围以及优化效果,吸引潜在客户的关注,提升公司在搜索引擎中的排名和可见性。以下是对SEO公司网站主题设计的......
  • 二分专题
    二分最重要的就是check函数的编写以及边界的控制1.一定区间的完全平方数个数(除二分以外的简单写法)查看代码cout<<(int)(floor(sqrt(b))-ceil(sqrt(a))+1)<<endl;2.跳石头(为了最大化最小间隙,通过二分跳跃距离,期间通过和撤走石头数量进行比较,来判断此距离是否过短或......