《程序员面试金典(第6版)》面试题 10.03. 搜索旋转数组(二分法,分钟思想,入门题目)

news/2024/5/5 2:44:48/文章来源:https://blog.csdn.net/weixin_49503250/article/details/130136544

题目描述

搜索旋转数组。给定一个排序后的数组,包含n个整数,但这个数组已被旋转过很多次了,次数不详。请编写代码找出数组中的某个元素,假设数组元素原先是按升序排列的。若有多个相同元素,返回索引值最小的一个。

示例1:

  • 输入: arr = [15, 16, 19, 20, 25, 1, 3, 4, 5, 7, 10, 14], target = 5
    输出: 8(元素5在该数组中的索引)

示例2:

  • 输入:arr = [15, 16, 19, 20, 25, 1, 3, 4, 5, 7, 10, 14], target = 11
    输出:-1 (没有找到)

提示:

  • arr 长度范围在[1, 1000000]之间

解题思路与代码

这道题呢,其实最简单的方法其实就是一个for循环,顺序遍历,直接就解出来了。而且代码的安全性和健壮性也很强,不会有各种各样花里胡哨的错误。

但是呢,顺序遍历的性能呢,在数组较大的情况下可能就没有二分法,那么的好。而这题多半也就是想让你写出二分法的代码。那就如它所愿吧,我们来写一下稍微比较绕的二分法解决办法。

方法一:顺序查找法法

这个方法就一个for循环,我就不献丑写自己的代码了。直接开始讲解二分法的代码

方法二:二分查找法

  • 这道题使用的二分法,它其实是分治算法思想的一种体现。分治算法的基本思想就是将一个大问题分解成若干个较小的子问题,然后对这些子问题进行解决,最后将子问题的解合并并得到原始问题的解。

  • 在这道题中,我们使用二分法,将数组分成两个部分,每次迭代的时候会去确定目标值是在左半部分,还是在右半部分。然后将搜索范围缩小为相应的部分,并继续重复这个过程,直到找到目标值或者搜索范围为空。

  • 这里,我们将大问题(在整个数组中搜索目标值)分解成了较小的子问题(在左半部分还是右半部分搜索目标值),并逐步缩小问题规模,直到找到解决方案。这完美的体现了分钟算法的核心思想。

具体的代码如下:

class Solution {
public:int search(vector<int>& arr, int target) {int left = 0;int right = arr.size() -1;if(right == -1) return -1;while(left < right){int mid = (left + right) / 2 ;if(arr[left] < arr[mid]){ // 说明左半边是升序if(arr[left] <= target && arr[mid] >= target) right = mid;else left = mid + 1;}else if(arr[left] > arr[mid]){ // 说明左半边不是升序,右半边是升序if(arr[left] <= target || arr[mid] >= target) right = mid; else left = mid + 1;}else { // 可能找到了if(arr[left] != target) ++left;else right = left;}}return arr[left] == target ? left : -1;}
};

在这里插入图片描述

复杂度分析

时间复杂度:

  • 每次迭代时,我们将搜索范围缩小为原来的一半。因此,最多需要进行 O(log n) 次迭代,其中 n 是数组的长度。在这道题目的特殊情况下,由于可能需要处理重复元素,最坏情况下的时间复杂度会退化为 O(n)(例如,当所有元素都相同时)。然而,在没有重复元素或者重复元素较少的情况下,时间复杂度接近于 O(log n)。

空间复杂度:

  • 二分法是在原数组上进行操作的,不需要额外的数据结构来存储子数组。因此,空间复杂度为 O(1),即常数级别的额外空间。

总结

  • 这道题其实可以算是学习二分法或者分治思想的入门题目,还是很有必要去学习和掌握一下的。
  • 觉得我写的还行的小伙伴们请给我点一个赞,你们的赞就是对我持续输出优质内容的最大鼓励,谢谢!

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

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

相关文章

4.12~(小组成员对话预习)

注意我们这里观察的是XP的kernel32.dll&#xff0c;到win10是有变化的 看了这个函数&#xff0c;似乎是让BasepExeLdrEntry不存在的时候初始化一遍&#xff0c;然后进行对比是否已经加载过这个dll&#xff0c;那么如果加载下一个dll的时候&#xff0c;BasepExeLdrEntry是不是还…

SM59 RFC 目标 SAP_PROXY_ESR 设置到服务资源库连接的检查列表

设置到服务资源库连接的检查列表 1. 企业服务资源库的地址必须在 SAP 系统中已知 检查报表 SPROX_CHECK_IFR_ADDRESS。2. 要连接到企业服务资源库&#xff0c;必须维护 RFC 目标 "SAP_PROXY_ESR"。此 RFC 目标将由代理生成 / 事务 SPROXY 使用。必须使用事务 SM59 进…

规模化敏捷框架:Scrum@Scale

Scrum 敏捷方法有助于团队成员之间更有效地合作&#xff0c;实现共同的业务目标。但是当一个组织想要扩展 Scrum 方法到更多的团队时&#xff0c;应该如何实施&#xff1f;Scrum 仅为单团队开发、交付和运维产品提供了一个框架&#xff0c;而 ScrumScale&#xff08;SS&#xf…

Ubuntu20.04 安装QGIS

qgis的git&#xff1a; GitHub - qgis/QGIS: QGIS is a free, open source, cross platform (lin/win/mac) geographical information system (GIS) qgis的官网:Welcome to the QGIS project! qgis插件包下载地址&#xff1a;https://plugins.qgis.org/plugins/ 1.Prerequisi…

【LeetCode每日一题: 1039. 多边形三角剖分的最低得分 | 暴力递归=>记忆化搜索=>动态规划 | 区间dp 】

&#x1f34e;作者简介&#xff1a;硕风和炜&#xff0c;CSDN-Java领域新星创作者&#x1f3c6;&#xff0c;保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享&#x1f48e;&#x1f48e;&#x1f48e; &#x1f34e;座右…

【从零开始学Skynet】基础篇(七):Mysql数据库常用API

在上一篇中我们完成了对Mysql数据库的准备工作之后&#xff0c;这一篇我们写一个程序测试一下。 1、Mysql API 在写程序之前&#xff0c;我们先学习一下Mysql数据库常用API的使用&#xff1a; API说明mysql.connet(args)连接数据库&#xff0c;参数args是一个Lua表&#xff0c…

【2023 年第十三届 MathorCup 高校数学建模挑战赛】C 题 电商物流网络包裹应急调运与结构优化问题 建模方案及代码实现

【2023 年第十三届 MathorCup 高校数学建模挑战赛】C 题 电商物流网络包裹应急调运与结构优化问题 1 题目 电商物流网络由物流场地&#xff08;接货仓、分拣中心、营业部等&#xff09;和物流场 地之间的运输线路组成&#xff0c;如图 1 所示。受节假日和“双十一”、“618”等…

octave安装使用——吴恩达机器学习

下载octave 解压后双击octave.vbs进行安装 配置 pkg rebuildpkg list 使用基础命令 使用矩阵命令 移动数据 size&#xff1a;矩阵的行和列length&#xff1a;行和列的最大值 读取和存储数据 load&#xff1a;加载文件who&#xff1a;所有变量whos&#xff1a;更详细的变量…

Java容器使用注意点

前置&#xff1a;问题 判空集合转map集合遍历集合去重集合转数组数组转集合 一&#xff1a;集合判空 《阿里巴巴 Java 开发手册》的描述如下&#xff1a; 判断所有集合内部的元素是否为空&#xff0c;使用 isEmpty() 方法&#xff0c;而不是 size()0 的方式。 我们在开发中也…

EightCap易汇:外汇投资入门需要了解哪些必要知识?

外汇市场是国际投资市场&#xff0c;日内交易量巨大&#xff0c;盈利机会极多。外汇是一种含有杠杆的投资产品&#xff0c;杠杆带来了高收益&#xff0c;也会带来高风险&#xff0c;对于外汇新手来说存在一定难度。新手投资者要如何交易&#xff0c;才能抓住外汇市场的盈利机会…

金三银四没把握住,凉了...

大家好&#xff0c;前两天跟朋友感慨&#xff0c;今年的铜三铁四、裁员、疫情导致好多人都没拿到offer!现在互联网大厂终于迎来了应届生集中求职季。 对于想跳槽的软件测试人来说&#xff0c;绝对是个找工作的好时机。这时候&#xff0c;很多高薪技术岗、管理岗的缺口和市场需…

Nginx 正向代理、方向代理、端口转发

正向代理就是客户端代理&#xff0c;代理客户端&#xff0c;服务端不知道实际发起请求的客户端 正向代理中&#xff0c;proxy和client一般同一个lan或者网络可达&#xff0c;server与client一般不可达&#xff08;缓存场景除外&#xff09; 正向代理类似一个跳板机&#xff0c…

PNAS:土地利用和土地覆盖的变化决定了保护区的可持续性和影响

PNAS 中文题目&#xff1a; 土地利用和土地覆盖的变化决定了保护区的可持续性和影响 英文题目&#xff1a; Land-use and land-cover change shape the sustainability and impacts of protected areas 作者&#xff1a; Determinants and impacts of protected area remova…

ElasticSearch安装、启动、操作及概念简介

ElasticSearch快速入门 文件链接&#xff1a;https://pan.baidu.com/s/15kJtcHY-RAY3wzpJZIn4-w?pwd0k5a 提取码&#xff1a;0k5a 有些软件对于安装路径有一定的要求&#xff0c;例如&#xff1a;路径中不能有空格&#xff0c;不能有中文&#xff0c;不能有特殊符号&#xf…

若依— — 快速入门【源码分析】

若依— — 快速入门 1 什么是若依 官网地址&#xff1a;http://www.ruoyi.vip/ 若依是一款优秀的开源项目&#xff0c;涉及到企业开发中大部分的管理系统&#xff0c;我们依此为模板进行二次开发&#xff0c;可以快速开发出符合大部分公司中的后台管理系统。 2 使用若依 使用开…

Spring Security --- authorizeRequests配置

目录 自定义配置类之访问权限 匹配顺序规则 访问控制包含 访问控制url匹配 访问控制方法 角色、权限判断 使用注解进行角色权限控制 自定义配置类之访问权限 http.authorizeRequests()主要是对url进行访问权限控制通过这个方法来实现url授权操作支持链式写法 匹配顺序…

C++ 数组、指针、数组指针、指针数组、多级指针、STL-map、结构体 的 初始化 及其 初始化赋值

C 数组、指针、数组指针、指针数组、多级指针、STL-map、结构体 的 初始化 及其 初始化赋值C 数组、指针、数组指针、指针数组、多级指针、STL-map、结构体 的 初始化 及其 初始化赋值C 数组、指针、数组指针、指针数组、多级指针数组一维数组初始化&#xff1a;二维数组初始化…

算法训练Day30:332.重新安排行程 51. N皇后 37. 解数独

文章目录重新安排行程题解[N 皇后](https://leetcode.cn/problems/n-queens/description/)题解解数独题解重新安排行程 CategoryDifficultyLikesDislikesContestSlugProblemIndexScorealgorithmsHard (47.57%)7650--0 TagsCompanies 给你一份航线列表 tickets &#xff0c;其…

零基础如何入门网络安全?【2023最新】

前言 最近收到不少关注朋友的私信和留言&#xff0c;大多数都是零基础小友入门网络安全&#xff0c;需要相关资源学习。其实看过的铁粉都知道&#xff0c;之前的文里是有过推荐过的。新来的小友可能不太清楚&#xff0c;这里就系统地叙述一遍。 01.简单了解一下网络安全 说白…

【数据结构与算法篇】时间复杂度与空间复杂度

目录 一、数据结构和算法 1.什么是数据结构&#xff1f; 2.什么是算法&#xff1f; 3.数据结构和算法的重要性 二、算法的时间复杂度和空间复杂度 1.算法效率 2.算法的复杂度 3.复杂度在校招中的考察 4.时间复杂度 5.空间复杂度 6.常见复杂度对比 7.复杂度的OJ练…