牛客题解 | 二分查找-I

news/2025/2/22 15:12:18/文章来源:https://www.cnblogs.com/wc529065/p/18727199

题目

题目链接

题目的主要信息:
  • 给定一个元素升序的、无重复数字的整型数组 nums 和一个目标值 target
  • 找到目标值的下标
  • 如果找不到返回-1
举一反三:

学习完本题的思路你可以解决如下题目:

BM18.二维数组中的查找

BM19.寻找峰值

BM21.旋转数组

方法:二分法(推荐使用)

知识点:分治

分治即“分而治之”,“分”指的是将一个大而复杂的问题划分成多个性质相同但是规模更小的子问题,子问题继续按照这样划分,直到问题可以被轻易解决;“治”指的是将子问题单独进行处理。经过分治后的子问题,需要将解进行合并才能得到原问题的解,因此整个分治过程经常用递归来实现。

思路:

本来我们可以遍历数组直接查找,每次检查当前元素是不是要找的值。

for(int i = 0; i < nums.length; i++)if(nums[i] == target)return i;

但是这样这个有序的数组我们就没有完全利用起来。我们想想,若是目标值比较小,肯定在前半区间,若是目标值比较大,肯定在后半区间,怎么评价大小?我们可以用中点值作为一个标杆,将整个数组分为两个区间,目标值与中点值比较就能知道它会在哪个区间,这就是分治的思维。

具体做法:

  • step 1:从数组首尾开始,每次取中点值。
  • step 2:如果中间值等于目标即找到了,可返回下标,如果中点值大于目标,说明中点以后的都大于目标,因此目标在中点左半区间,如果中点值小于目标,则相反。
  • step 3:根据比较进入对应的区间,直到区间左右端相遇,意味着没有找到。

图示:

alt

Java实现代码:

import java.util.*;
public class Solution {public int search (int[] nums, int target) {int l = 0;int r = nums.length - 1;//从数组首尾开始,直到二者相遇while(l <= r){ //每次检查中点的值int m = (l + r) / 2; if(nums[m] == target)return m;//进入左的区间if(nums[m] > target) r = m - 1;//进入右区间else l = m + 1;}//未找到return -1; }
}

C++实现代码:

class Solution {
public:int search(vector<int>& nums, int target) {int l = 0;int r = nums.size() - 1;//从数组首尾开始,直到二者相遇while(l <= r){ //每次检查中点的值int m = (l + r) / 2; if(nums[m] == target)return m;//进入左的区间if(nums[m] > target) r = m - 1;//进入右区间else l = m + 1;}//未找到return -1; }
};

Python代码实现

class Solution:def search(self , nums: List[int], target: int) -> int:l = 0r = len(nums) - 1# 从数组首尾开始,直到二者相遇while l <= r :# 每次检查中点的值 m = int((l+r)/2) if nums[m] == target:return m# 进入左的区间if nums[m] > target: r = m - 1# 进入右区间else: l = m + 1# 未找到return -1 

复杂度分析:

  • 时间复杂度:\(O(log_2n)\),对长度为\(n\)的数组进行二分,最坏情况就是取2的对数
  • 空间复杂度:\(O(1)\),常数级变量,无额外辅助空间

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/887250.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ML树构建简明教程

数据准备 Teamviewer登录实验室服务器,访问http://172.17.128.86:8501/CleanData,按照页面对应的格式要求分别从NCBI和GISAID数据库下载数据,拖拽到对应的位置,点击GO即可。Gisaid DNA Accession no.|DNA INSDC|Isolate name|Collection date|SegmentNCBI Format:>{acc…

windows11安装

准备工作 1.一个8G以上的U盘 2.可以上网的电脑 3.要安装的电脑接好可上网的网线开始:把U盘的资料先备份,因为制作U盘安装系统需要格式化U盘 打开微软官网下载 https://www.microsoft.com/zh-cn/software-download/windows11选择创建 Windows 11 安装媒体,会下载一个"me…

DeepSeek崛起:程序员“饭碗”被抢,还是职业进化新起点?

2025年伊始,Meta创始人扎克伯格的一则声明引发全球程序员热议:“AI将在今年达到中级工程师水平,逐步接管编程工作。”与此同时,国产AI大模型DeepSeek的爆火,让一名8岁女孩仅用45分钟开发出聊天机器人的案例刷屏全网。AI的代码能力已从“辅助工具”跃升为“协同开发者”,程…

java-调用火山引擎官方API

java-调用火山引擎官方API(字节跳动旗下的AI服务平台),AI模型包括:DeepSeek、豆包、其他。。。 2025-02-20 16:33:06 星期四一、官方平台入口: 入口如下:https://console.volcengine.com/user/basics/ 1>.使用方式:1.在开放平台注册账号具体按照指引及进行注册即可,包…

reactnative 手写签名报错

有没有大佬知道这种问题怎么解决!!!!! 在线等!!!

Ollama模型迁移

为了方便本地大模型部署和迁移,本文提供了一个关于Ollama的模型本地迁移的方法。由于直接从Ollama Hub下载下来的模型,或者是比较大的GGUF模型文件,往往会被切分成多个,而文件名在Ollama的路径中又被执行了sha256散列变换。因此我们需要从索引文件中获取相应的文件名,再进…

阻塞IO 非阻塞IO

网络IO流程三次握手流程阻塞IO非阻塞IO阻塞IO和非阻塞IO的区别 阻塞IO:io 未就绪的情况下,会阻塞线程等待 非阻塞IO:io 未就绪的情况下,立即返回socket默认的情况是阻塞的

How Do Recommendation Models Amplify Popularity Bias? An Analysis from the Spectral Perspective

目录概符号说明Popularity bias\(\mathbf{q}_1\) 和 \(\mathbf{r}\) 具有高相似度相似度随着维度降低而增加相似度随着训练的变化ReSN: Regulartion with Spectral NormLin S., Gao C., Chen J., Zhou S., Hu B., Feng Y., Chen C. and Wang C. How do recommendation models a…

(文末有福利!)深度剖析大语言模型推理:指标、优化与框架选择

在人工智能飞速发展的当下,大语言模型(LLM)已然成为焦点。从智能聊天机器人到内容创作辅助,大语言模型的应用无处不在。但你是否了解其背后的推理过程,以及如何让这些模型运行得又快又好?今天,我们就来深入探讨大语言模型推理的奥秘。一、🌟大语言模型推理指标详解 在…

Docker之网络模型

Docker的网络模型类型 说明None 不为容器配置任何网络功能,没有网络 --net=noneContainer 与另一个运行中的容器共享Network Namespace,--net=container:containerID,k8s中Pod容器之间用此网络。Host 与主机共享Network Namespace,--net=hostBridge Docker设计的NAT网络模型…

初来园子

金易安装与使用说明 金易介绍 【金易】是交易外汇黄金的专项EA,只能用来交易黄金,做日内超短线的交易,是我们EA开发研究院研发多年的EA。金易由一位金融高校毕业有着超过十年外汇黄金实盘交易,黄金交易年入超十万美金的操盘高手指导完成,有着成熟的交易模型,也有完善的系…

太好了,IDE支持满血版DeepSeek了,我们有救了!

近期通义灵码能力再升级全新上线模型选择功能,目前已经支持 Qwen2.5、DeepSeek-V3 和 R1系列模型,用户可以在 VSCode 和 JetBrains 里搜索并下载最新通义灵码插件,在输入框里选择模型,即可轻松切换模型。你好呀,我是歪歪。 今年 1 月,通义灵码 AI 程序员全面上线,同时支…