LeetCode题练习与总结:搜索旋转排序数组

一、题目

整数数组 nums 按升序排列,数组中的值 互不相同

在传递给函数之前,nums 在预先未知的某个下标 k0 <= k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2]

给你 旋转后 的数组 nums 和一个整数 target ,如果 nums 中存在这个目标值 target ,则返回它的下标,否则返回 -1 。

你必须设计一个时间复杂度为 O(log n) 的算法解决此问题。

二、解题思路

  1. 初始化两个指针,leftright,分别指向数组的开始和结束。
  2. left 小于 right 时,执行以下步骤: a. 计算中间位置 mid。 b. 如果 nums[mid] 等于 target,则返回 mid。 c. 判断 nums[left]nums[mid] 之间的值是否有序:
    • 如果有序,说明 target 必须在 leftmid 之间,更新 rightmid - 1
    • 如果无序,说明 target 必须在 midright 之间,更新 leftmid + 1
  3. 如果循环结束还没有找到 target,则返回 -1

三、具体代码

class Solution {public int search(int[] nums, int target) {int left = 0;int right = nums.length - 1;while (left < right) {int mid = left + (right - left) / 2;// 如果找到了目标值if (nums[mid] == target) {return mid;}// 判断左右两边哪一边是有序的if (nums[left] <= nums[mid]) {// 左边有序,target 在左边if (nums[left] <= target && target < nums[mid]) {right = mid - 1;} else {left = mid + 1;}} else {// 右边有序,target 在右边if (nums[mid] < target && target <= nums[right]) {left = mid + 1;} else {right = mid - 1;}}}// 循环结束,如果 left 等于 right 且 nums[left] 等于 target,则返回 left// 否则返回 -1return nums[left] == target ? left : -1;}
}

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 时间复杂度是 O(log n)。
  • 这是因为在每次迭代中,搜索范围都会减半。
  • 这是二分查找算法的典型特征,其中 n 是数组的长度。
  • 在最坏的情况下,需要进行 log(n) 次迭代才能找到目标值或确定目标值不存在。
2. 空间复杂度
  • 空间复杂度是 O(1)。
  • 这个算法是原地进行的,不需要额外的存储空间。
  • 所有的计算都是在常量级别的额外空间内完成的,例如使用几个辅助变量(left, right, mid)。
  • 这些变量的数量不随着输入数据的规模变化,因此空间复杂度是常数级别的。

五、总结知识点

1. 二分查找算法(Binary Search):

  • 这是一种在有序数组中查找特定元素的高效算法。
  • 通过不断将搜索范围减半,二分查找可以在对数时间内找到目标值或确定目标值不存在。

2. 旋转排序数组的处理:

  • 由于数组是旋转过的,它不再是完全有序的,这就需要在二分查找的基础上进行调整。
  • 通过比较数组的两端(leftright)以及中间点(mid)的值,可以确定哪一半是有序的,并据此调整搜索范围。

3. 条件判断和循环控制:

  • 使用 while 循环来重复执行二分查找的过程,直到找到目标值或搜索范围为空。
  • 使用 ifelse 语句来判断数组的哪一半是有序的,并据此更新搜索范围的边界。

4. 数组索引的更新:

  • 根据中间点 mid 的值与目标值 target 的关系,以及数组的有序性,更新 leftright 的值。

5. 返回值的处理:

  • 如果在循环结束后 leftright 相遇,并且 nums[left] 等于 target,则返回 left
  • 如果 leftright 相遇,但 nums[left] 不等于 target,则返回 -1 表示目标值不存在于数组中。

6. 防止整数溢出:

  • 在计算 mid 时,使用 left + (right - left) / 2 而不是 (left + right) / 2 来避免可能的整数溢出问题。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

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

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

相关文章

OpenAI:ChatGPT API 文档之 Embedding

在自然语言处理和机器学习领域&#xff0c;"embeddings" 是指将单词、短语或文本转换成连续向量空间的过程。这个向量空间通常被称为嵌入空间&#xff08;embedding space&#xff09;&#xff0c;而生成的向量则称为嵌入向量&#xff08;embedding vector&#xff0…

14---DVI电路设计

视频链接 DVI硬件电路设计01_哔哩哔哩_bilibili DVI电路设计 1、DVI的简介 DVI(Digital Visual Interface)&#xff0c;即数字视频接口。它是1998年9月&#xff0c;在Intel开发者论坛上成立的&#xff0c;由Silicon Image、Intel(英特尔)、Compaq(康柏)、IBM(国际商业机器公…

时序数据库:TDengine整体架构

文章目录 [toc]一、集群与基本逻辑单元1.主要逻辑单元2.节点之间的通讯3.一个典型的消息流程 二、存储模型与数据分区、分片1.存储模型2.数据分片3.数据分区4.负载均衡 三、数据写入与复制流程1.Master Vnode 写入流程2.Slave Vnode 写入流程3.主从选择4.同步复制 四、缓存与持…

关于SpringSecurity出现Failed to evaluate expression ‘ps.hasAuthority(‘role‘)‘

1. 问题描述 在使用SpringSecurity对接口进行权限校验时&#xff0c;报错java.lang.IllegalArgumentException: Failed to evaluate expression ps.hasAuthority(role)。 2. 解决方案 2.1 查看是否添加注解 对于SpringSecurity对配置类&#xff0c;我们需要添加注解EnableGlo…

五 超级数据查看器 讲解稿 列表功能2

五 超级数据查看器 讲解稿 列表功能2 点击此处 以新页面 打开B站 播放教学视频 点此下载 百度手机助手 下载地址4 讲解稿全文&#xff1a; 大家好&#xff0c;今天我们讲解一下&#xff0c;超级数据查看器列表界面&#xff0c;分为1-2两集。这是第二集 继续讲解弹出式菜单…

Linux环境(Ubuntu)上的防火墙工具使用方法

目录 概述 1 防火墙工具&#xff08;ufw&#xff09; 1.1 安装防火墙工具&#xff1a; 1.2 操作防火墙相关命令 2 ufw操作命令的范例 2.1 打开/关闭防火墙 2.1.1 打开防火墙 2.1.2 关闭防火墙 2.1.3 查询当前防火墙状态 2.1.4 允许选择的端口访问 2.1.5 允许选择固定…

【数据结构】线性表的定义及基本操作

文章目录 前言线性表的定义线性表的基本操作基本操作其他常用操作 总结 前言 数据结构的三要素是逻辑结构、数据的运算、存储结构&#xff08;物理结构&#xff09;&#xff0c;存储结构不同&#xff0c;运算的实现方式也不同。 本次文章包括线性表的定义和基本操作&#xff0…

java零基础入门-map(上)

一、教学目标 掌握何为map能够说出map集合的特点。能够使用map集合添加元素、删除元素等伴生方法。 二、正文 1、概述 说起map&#xff0c;想必大家并不陌生吧。之前我在讲Collection集合的时候&#xff0c;我是给大家提过一嘴&#xff0c;我说Collection集合被称为单列集合…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的人群密度检测系统(深度学习模型+UI界面+训练数据集)

摘要&#xff1a;开发人群密度检测系统对于公共安全等领域具有关键作用。本篇博客详细介绍了如何运用深度学习构建一个人群密度检测系统&#xff0c;并提供了完整的实现代码。该系统基于强大的YOLOv8算法&#xff0c;并对比了YOLOv7、YOLOv6、YOLOv5&#xff0c;展示了不同模型…

07-java基础-锁之AQSReentrantLockBlockingQueueCountDownLatchSemapho

文章目录 0&#xff1a;AQS简介-常见面试题AQS具备特性state表示资源的可用状态AQS定义两种资源共享方式AQS定义两种队列自定义同步器实现时主要实现以下几种方法&#xff1a;同步等待队列条件等待队列 1&#xff1a;AQS应用之ReentrantLockReentrantLock如何实现synchronized不…

uniapp相关内容

一、设置uni原生事件类型 示例&#xff1a;获取手机号事件类型为 UniHelper.ButtonOnGetphonenumber 格式为&#xff1a;UniHelper.组件名事件名 const getphonenumber: UniHelper.ButtonOnGetphonenumber (detail) > {console.log(detail) } <button class"…

【小程序】API能力集成指南——子设备API汇总(一)

ty.device.getSubDeviceInfoList 获取子设备信息 需引入DeviceKit&#xff0c;且在>1.2.6版本才可使用 参数 Object object 属性类型默认值必填说明meshIdstring是网关设备 id 或上级节点 idcompletefunction否接口调用结束的回调函数&#xff08;调用成功、失败都会执行…

[linux] pip install -e . 和 pip install -e “.[train]“分别是什么意思

pip install -e . 和 pip install -e ".[train]" 都是 Python 包管理工具 pip 的安装命令&#xff0c;它们用于安装一个以“可编辑”模式的本地项目。这里的“可编辑”模式意味着项目被安装到当前环境中&#xff0c;但是它链接到你实际代码所在的位置&#xff0c;这样…

oracle临时表空间不释放

项目报错 nested exception is java.sql.SQLException: ORA-01652: unable to extend temp segment by 128 in tablespace TEMP 原因是临时表空间满了&#xff0c;临时表空间一直增长&#xff0c;未释放导致临时表空间使用率100%。 查询临时表空间使用率 --临时表空间利用率…

拓扑排序 很简单

原文链接&#xff1a;图论第四讲&#xff1a;拓扑排序 说明&#xff1a;CSDN和公众号文章同步发布&#xff0c;需要第一时间收到最新内容&#xff0c;请关注公众号【比特正传】。 之前的图论合集文章中讲了图的存储遍历、最短路等算法&#xff0c;文章链接如下 图论第一讲&am…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《考虑碳捕集机组与氢储能系统协调运行的源荷储低碳经济调度》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

Redis监控命令和指标介绍

Redis监控的重要性 Redis监控的重要性体现在以下几个核心方面&#xff1a; 性能瓶颈发现与优化&#xff1a; 监控Redis的响应时间、QPS&#xff08;每秒查询率&#xff09;、吞吐量等性能指标&#xff0c;可以及时识别出系统在处理请求时是否存在性能瓶颈&#xff0c;比如某…

AI新工具(20240312) Midjourney官方发布角色一致性功能;免费且开源的简历制作工具;精确克隆语调、控制声音风格

1: Midjourney角色一致性功能 使人物画像在多方面高度一致成为可能。 Midjourney的角色一致性功能的使用方法如下&#xff1a; ⭐在你的输入指令后面加上 --cref URL&#xff0c;其中URL是你选择的角色图像的链接。 ⭐你可以通过 --cw 参数来调整参照的强度&#xff0c;范围…

力扣- 704. 二分查找

二分查找 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。 示例 1: 输入: nums [-1,0,3,5,9,12], target 9 输出: 4 解释…

python如何读取文件

这里的文件是txt文件&#xff0c;office文件不支持。 假如有一个pi_digits的txt文件&#xff0c;里面的内容是“3.1415926” 如果要读取这个文件的内容&#xff0c;需要调取pathlib模块&#xff0c;并把路径告知python。同时python文件必须要和目标读取文件在一个文件夹里。 …