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

news2024/10/5 7:24:17

题目描述

搜索旋转数组。给定一个排序后的数组,包含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.coloradmin.cn/o/421569.html

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

相关文章

C学习笔记2

1、二进制由 0 和 1 两个数字组成&#xff0c;使用时必须以0b或0B&#xff08;不区分大小写&#xff09;开头 2、符号位进制形式进制数据 &#xff08;进制形式决定后面的数据是哪种进制&#xff09; 3、合法的二进制 int a 0b101; // 0b是二进制的进制形式 101是进制…

buildroot使用外部编译链编译bluez蓝牙工具

在开发ublox w263 wifi蓝牙时&#xff0c;之前是使用yocto系统集成编译出的bluez工具&#xff0c;减少了自己编译工具软件和依赖库的工作&#xff0c;切换项目使用原生linux系统后&#xff0c;所以的软件需要自己编译&#xff0c;不想编译每个依赖文件和库&#xff0c;所以使用…

Pytorch深度学习笔记(三)线性模型

目录 1.机械学习的过程 2.线性模型 推荐课程&#xff1a;2.线性模型_哔哩哔哩_bilibili 1.机械学习的过程 机械学习的过程&#xff1a; 1.准备数据集DataSet——>2.选择模型Model——>3.训练Training——>4.推理Infering 监督学习&#xff1a;用已知标签的训练样本训…

Spark大数据处理讲课笔记3.1 掌握RDD的创建

文章目录零、本节学习目标一、RDD为何物&#xff08;一&#xff09;RDD概念&#xff08;二&#xff09;RDD示例&#xff08;三&#xff09;RDD主要特征二、做好准备工作&#xff08;一&#xff09;准备文件1、准备本地系统文件2、启动HDFS服务3、上传文件到HDFS&#xff08;二&…

4年软件测试工作经验,跳槽之后面试20余家公司的总结

先说一下自己的个人情况&#xff0c;普通二本计算机专业毕业&#xff0c;懂python&#xff0c;会写脚本&#xff0c;会selenium&#xff0c;会性能&#xff0c;然而离职后到今天都没有收到一份offer&#xff01;一直在待业中&#xff0c;从离职第一天就开始准备简历&#xff0c…

快排的非递归实现

其思想与递归实现快排完全相同&#xff0c;可以先将第一次要排序的右边界和左边界先后入栈&#xff0c;然后判断栈 是否为空&#xff0c;不为空就出栈顶元素&#xff0c;并删除一次&#xff0c;由于栈是先进的后出&#xff0c;所以先出来的应该是左界&#xff0c; 再进行一次…

【C++】STL——unordered_map和unordered_set的介绍和使用

unordered_set和unordered_map的介绍和使用 文章目录unordered_set和unordered_map的介绍和使用一、unordered系列关联式容器二、unordered_set1.unordered_set的介绍2.unordered_set的构造方式3.unordered_set的函数接口说明4.unordered_multiset的介绍及使用三、unordered_ma…

【建议收藏】数据库 SQL 入门——约束(内附演示)

文章目录&#x1f4da;引言&#x1f4d6;约束&#x1f4d1;非空约束&#x1f4d1;唯一约束&#x1f4d1;主键约束&#x1f4d1;默认约束&#x1f4d1;检查约束&#x1f4d1;外键约束&#x1f516;外键的添加&#x1f516;删除/更新外键&#x1f4cd;总结&#x1f4da;引言 &…

【高危】Apache Linkis Gateway模块存在身份验证绕过漏洞(CVE-2023-27987)

漏洞描述 Apache Linkis 是一个用于将上层应用与底层数据引擎解耦&#xff0c;提供标准化接口的中间件。Gateway 是 Linkis 接受客户端和外部请求的主要入口点&#xff0c; 在 Apache Linkis 受影响版本中&#xff0c;由于在 Linkis Gateway 部署时产生的Token默认为LINKIS_C…

Linux打印口/LPT口出厂测试工具与使用说明

1 软件功能 该软件用于在Linux平台测试CH35X/CH38X&#xff08;PCI/PCIe转串并口&#xff09;的并口各引脚功能是否正常。方便对设备进行出厂测试。 2 并口测试硬件治具 在测试前&#xff0c;需要制作单独的硬件治具&#xff0c;按下表连接信号线&#xff1a; 25针并口座子堵…

面向削峰填谷的电动汽车多目标优化调度策略

说明书 MATLAB代码&#xff1a;面向削峰填谷的电动汽车多目标优化调度策略 关键词&#xff1a;电动汽车 削峰填谷 多目标 充放电优化 参考文档&#xff1a;店主自己整理的说明文档&#xff0c;公式、约束、数据齐全&#xff0c;可联系我查看 仿真平台&#xff1a;MATLAB YA…

iPhone如何不用iTunes将视频传输到电脑上?

随着智能手机的普及&#xff0c;iPhone已经成为了人们生活中必不可少的一部分。而随着iPhone摄像功能的逐渐完善&#xff0c;越来越多的用户开始将iPhone作为拍摄视频的工具。 但是&#xff0c;将iPhone中的视频传输到电脑并进行后续编辑处理或者备份储存&#xff0c;对于许多…

二极管专题:二极管钳位电路

二极管钳位电路 之前我们说过二极管的限幅功能 二极管专题&#xff1a;限幅电路。今天说的二极管的钳位电路和二极管的限幅电路都是利用了二极管正向压降一定的这么一个特点。限幅电路和钳位电路你说区别大呢&#xff0c;它也不大&#xff0c;说小呢也不小。就看你怎么理解了&…

Linux proc文件系统介绍

Linux proc文件系统 /proc/cmdline Arguments passed to the Linux kernel at boot time. Often done via a boot manager such as lilo(8) or grub(8) proc/[pid]/coredump_filter Since kernel 2.6.23, the Linux-specific /proc/PID/coredump_filter file can be used …

大数据项目实战之数据仓库:电商数据仓库系统——第6章 数据仓库环境准备

第6章 数据仓库环境准备 6.1 数据仓库运行环境 6.1.1 Hive环境搭建 1&#xff09;Hive引擎简介 Hive引擎包括&#xff1a;默认MR、Tez、Spark。 Hive on Spark&#xff1a;Hive既作为存储元数据又负责SQL的解析优化&#xff0c;语法是HQL语法&#xff0c;执行引擎变成了Sp…

【收藏】2023欧洲 KubeCon 和云原生大会上关于WebAssembly的一切

KubeCon CloudNativeCon EU 2023将于4月18日至21日在阿姆斯特丹举行&#xff0c;对于云原生开发者和云原生用户是一年中无比期待的大会。会议为期四天&#xff0c;是保持云原生计算最新趋势&#xff0c;与同行建立联系&#xff0c;并从行业专家学习的绝佳机会。此外&#xff0…

2023年税务师事务所行业研究报告

第一章 行业发展概况 1.1 行业概况 税务师事务所是依法设立并承办法律、法规、规章规定的涉税服务和鉴证业务的社会中介机构。税务师事务所的组织形式为有限责任制税务师事务所和合伙制税务师事务所&#xff0c;以及国家税务总局规定的其他形式。税务师事务所应当依法纳税&am…

软件测试实验:静态测试

目录 前言 一、实验目的 二、实验内容 三、实验步骤 四、实验过程 1、学生宿舍管理系统代码 2、汇总表 3、C语言编码规范 总结 前言 软件测试是软件开发过程中不可或缺的一个环节&#xff0c;它可以保证软件的质量和功能&#xff0c;提高用户的满意度和信任度。软件测…

通信工程有哪些SCI期刊推荐? - 易智编译EaseEditing

以下是通信工程领域的一些SCI期刊推荐&#xff1a; IEEE Transactions on Communications&#xff1a; 该期刊由IEEE出版&#xff0c;是通信工程领域的顶级期刊&#xff0c;涵盖了通信系统、信号处理、无线通信、光通信、网络通信、通信安全等方面的研究。 IEEE Journal on S…

如何使用公网远程访问jupyter notebook【cpolar内网穿透】

文章目录前言视频教程1. Python环境安装2. Jupyter 安装3. 启动Jupyter Notebook4. 远程访问4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口5. 固定公网地址转载自远控源码文章&#xff1a;公网远程访问jupyter notebook【cpolar内网穿透】 前言 Jupyter Notebook&#…