当前位置: 首页 > news >正文

LeetCode 面试题 10.03. 搜索旋转数组

文章目录

  • 一、题目
  • 二、C# 题解

一、题目

  搜索旋转数组。给定一个排序后的数组,包含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]之间

  点击此处跳转题目。

二、C# 题解

  类似二分查找,但由于优先返回第一次出现的 target,因此主要思想如下:

  • 取中间元素 arr[mid],判断是否为 target。如果是,不直接返回,而转到步骤 2。
  • 查找左半部分,结果记为 left。如果查找到结果(left >= 0),则直接返回 left。
  • 若未找到,最后查找右半部分,返回结果。

  上述方式类似前序遍历树结构,返回第一个查找的值。

  同时,做出如下剪枝优化:

  1. 数组被旋转,则数组内所有元素都在区间 [ a r r [ i ] , + ∞ ) ∪ ( − ∞ , a r r [ j ] ] [arr[i], +\infty)\cup(-\infty,arr[j]] [arr[i],+)(,arr[j]] 内。若 target 不在该区间内,直接返回 -1。
    15 , 16 , 19 , 20 , 25 , 1 , 3 , 4 , 5 , 7 , 10 t a r g e t : 12 \begin{aligned} & \sout{15, 16, 19, 20, 25, 1, 3, 4, 5, 7, 10} & target:12 \\ \end{aligned} 15,16,19,20,25,1,3,4,5,7,10target:12

  2. 数组未被旋转(有序),则数组内所有元素都在区间 [ a r r [ i ] , a r r [ j ] ] [arr[i], arr[j]] [arr[i],arr[j]] 内。若 target 不在该区间内,直接返回 -1。
    1 , 3 , 4 , 5 , 7 , 10 , 15 , 16 , 19 , 20 , 25 t a r g e t : 30 \begin{aligned} & \sout{1, 3, 4, 5, 7, 10, 15, 16, 19, 20, 25} & target:30 \\ \end{aligned} 1,3,4,5,7,10,15,16,19,20,25target:30

  3. mid 查找到值,即 arr[mid] == target。则只查看左枝,减去右枝。
    { 15 , 16 , 19 , 20 , 1 } , 2 ‾ , 3 , 4 , 5 , 7 , 10 t a r g e t : 2 \begin{aligned} & \{15, 16, 19, 20, 1\}, \underline{\bold{2}}, \sout{3, 4, 5, 7, 10} & target:2 \\ \end{aligned} {15,16,19,20,1},2,3,4,5,7,10target:2

  4. 右枝有序且 target 在该区间内,则忽略左枝,只看右枝。
    15 , 16 , 19 , 20 , 1 , 2 ‾ , { 3 , 4 , 5 , 7 , 10 } t a r g e t : 5 \begin{aligned} & \sout{15, 16, 19, 20, 1}, \underline{2}, \{3, 4, 5, 7, 10\} & target:5 \\ \end{aligned} 15,16,19,20,1,2,{3,4,5,7,10}target:5

public class Solution {public int Search(int[] arr, int target) {return Partition(arr, 0, arr.Length - 1, target);}public int Partition(int[] arr, int i, int j, int target) {if (i > j) return -1; // 递归出口// 剪枝if (arr[j] < target && target < arr[i]) return -1; // case 1, 直接返回if (target < arr[i] && target > arr[j]) return -1; // case 2, 直接返回int mid = (i + j) / 2, left;if (arr[mid] == target) { // case 3, 减去右半部分left = Math.Min(Partition(arr, i, mid - 1, target), mid);return left == -1 ? mid : left;}if (arr[mid] < target && target < arr[j]) // case 4, 减去左半部分return Partition(arr, mid + 1, j, target);// 优先返回最前面的结果left = Partition(arr, i, mid - 1, target);if (left != -1) return left;return Partition(arr, mid + 1, j, target);}
}
  • 时间:84 ms,击败 100.00% 使用 C# 的用户
  • 内存:39.92 MB,击败 100.00% 使用 C# 的用户

  还可以先用二分查找转折点 k,此时考虑起点为 k 终点为 k - 1 的循环数组,即,从 [k, j] 续上 [i, k - 1] 的有序数组,对其使用二分查找第一个元素。详细代码这里就不附上了。

↱ k 15 , 16 , 19 , 20 , 1 ‾ , 2 , 3 , 4 , 5 , 7 , 10 t a r g e t : 5 ⇓ − , − , − , − , 1 ‾ , 2 , 3 , 4 , 5 , 7 , 10 , 15 , 16 , 19 , 20 t a r g e t : 5 \begin{aligned} & \hspace{5.7em} \Rsh k \\ & 15, 16, 19, 20, \underline{1}, 2, 3, 4, 5, 7, 10 & target:5 \\ & \hspace{5.7em} \Downarrow\\ & -,\ -,\ -,\ -, \hspace{0.1em} \underline{1}, 2, 3, 4, 5, 7, 10, 15, 16, 19, 20 & target:5 \\ \end{aligned} k15,16,19,20,1,2,3,4,5,7,10, , , ,1,2,3,4,5,7,10,15,16,19,20target:5target:5

相关文章:

LeetCode 面试题 10.03. 搜索旋转数组

文章目录 一、题目二、C# 题解 一、题目 搜索旋转数组。给定一个排序后的数组&#xff0c;包含n个整数&#xff0c;但这个数组已被旋转过很多次了&#xff0c;次数不详。请编写代码找出数组中的某个元素&#xff0c;假设数组元素原先是按升序排列的。若有多个相同元素&#xff…...

SpringCloudSleuth异步线程支持和传递

场景 在使用Sleuth做链路跟踪时&#xff0c;默认情况下异步线程会断链&#xff0c;需要进行代码调整支持。 调整内容 方式一 使用Async实现异步线程 开启异步线程池 EnableAsync SpringBootApplication public class LizzApplication {public static void main(String[] a…...

如何使用 Disco 将黑白照片彩色化

Disco 是一个基于视觉语言模型&#xff08;LLM&#xff09;的图像彩色化工具。它使用 LLM 来生成彩色图像&#xff0c;这些图像与原始黑白图像相似。 本文将介绍如何使用 Disco 将黑白照片彩色化。 使用 Disco 提供了一个简单的在线演示&#xff0c;可以用于测试模型。 访问…...

ChatGPT AIGC 制作大屏可视化分析案例

第一部分提示词prompt: 商品 价格 p1 13 p2 41 p3 42 p4 53 p5 19 p6 28 p7 92 p8 62 城市 销量 北京 69 上海 13 南京 18 武汉 66 成都 70 你现在是一名非常专业的数据分析师,请结合上述数据完成下列几件事情 1:第一部分数…...

2023年9款好用的在线流程图软件推荐!

随着互联网技术和基础设施的发展&#xff0c;人们能用上比过去更加稳定的网络&#xff0c;因此在使用各类工具软件时&#xff0c;越来越倾向于选择在线工具&#xff0c;或是推出了网页版的应用。 就流程图软件而言&#xff0c;过去想要绘制流程图&#xff0c;我们得在电脑上安…...

剑指Offer || 044.在每个树行中找最大值

题目 给定一棵二叉树的根节点 root &#xff0c;请找出该二叉树中每一层的最大值。 示例1&#xff1a; 输入: root [1,3,2,5,3,null,9] 输出: [1,3,9] 解释:1/ \3 2/ \ \ 5 3 9 示例2&#xff1a; 输入: root [1,2,3] 输出: [1,3] 解释:1/ \2 3示例3&#xff…...

ESP32网络开发实例-UDP数据发送与接收

UDP数据发送与接收 文章目录 UDP数据发送与接收1、UDP简单介绍2、软件准备3、硬件准备4、代码实现本文将详细介绍在Arduino开发环境中,如何实现ESP32通过UDP协议进行数据发送与接收。 1、UDP简单介绍 用户数据报协议 (UDP) 是一种跨互联网使用的通信协议,用于对时间敏感的传…...

液压自动化成套设备比例阀放大器

液压电气成套设备的比例阀放大器是一种电子控制设备&#xff0c;用于控制液压动力系统中的液压比例阀1。 比例阀放大器通常采用电子信号进行控制&#xff0c;以控制比例阀的开度和流量&#xff0c;以实现液压系统的可靠控制。比例阀放大器主要由以下组成部分&#xff1a; 驱动…...

专业144,总分440+,上岸西北工业大学827西工大信号与系统考研经验分享

我的初试备考从4月末&#xff0c;持续到初试前&#xff0c;这中间没有中断。 总的时间分配上&#xff0c;是数学>专业课>英语>政治&#xff0c;虽然大家可支配时间和基础千差万别&#xff0c;但是这么分配是没错的。 数学 时间安排&#xff1a;3月-7月&#xff1a;…...

JQuery - template.js 完美解决动态展示轮播图,轮播图不显示问题

介绍 在JQuery中,使用template.js把轮播图的图片渲染到页面后,发现无法显示。 解决方案 首先,打开控制台发现,图片dom是生成了的,排除dom的缺失其次,换了一个插件Swiper,发现效果一样,排除插件的沦丧把动态数据换成假数据,...

CC2540和CC2541的区别简单解析

CC2541理论上是CC2540的精简版&#xff0c;去除了USB接口&#xff0c;增加了1个HW1C接口。 CC2540集成了2.4GHz射频收发器&#xff0c;是一款完全兼容8051内核的无线射频单片机&#xff0c;它与蓝牙低功耗协议栈共同构成高性价比、低功耗的片上系统&#xff08;SOC&#xff09…...

Java8 新特性之Stream(八)-- Stream的collect()与Collectors的联合运用

目录 1. collect()的 收集 作用 2. collect()的 统计 作用 3. collect()的 分组 作用 4. collect()的 拼接 作用...

SpringBoot基础详解

目录 SpringBoot自动配置 基于条件的自动配置 调整自动配置的顺序 纷杂的SpringBoot Starter 手写简单spring-boot-starter示例 SpringBoot自动配置 用一句话说自动配置&#xff1a;EnableAutoConfiguration借助SpringFactoriesLoader将标准了Configuration的JavaConfig类…...

学会Docker之---应用场景和基本操作

实体机、VM和容器 实体机&#xff08;Physical Machine&#xff09;是指实际的物理设备&#xff0c;例如我们常见的计算机主机、服务器等。它们是由硬件组成&#xff0c;可以直接运行操作系统和应用程序。 虚拟机&#xff08;Virtual Machine&#xff09;是在一台物理机上通过…...

C++_linux下_非阻塞键盘控制_程序暂停和继续

1. 功能 在程序执行过程中,点击键盘p按键(pause), 程序暂停, 点击键盘上的n按键(next),程序继续执行 2. 代码 #include <iostream> #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/ioctl.h> char get_keyboar…...

SQL AND, OR and NOT(与,或不是运算符)

SQL AND & OR 运算符 AND&OR运算符用于根据一个以上的条件过滤记录&#xff0c;即用于组合多个条件以缩小SQL语句中的数据。 WHERE子句可以与AND&#xff0c;OR和NOT运算符结合使用。 AND和OR运算符用于根据多个条件筛选记录&#xff1a; 如果由AND分隔的所有条件为TR…...

Python网络编程之Socket(套接字)

文章目录 一、Socket概念二、套接字的发展史及分类三、Socket的使用语法格式(基于TCP协议)1.基于TCP协议的套接字(socket)编程半连接池 2.基于UDP协议的套接字(socket)编程也可以使用服务端只接收客户端消息 黏包现象 一、Socket概念 Socket套接字&#xff0c;一种独立于协议的…...

金山终端安全系统V9.0 SQL注入漏洞复现

0x01 产品简介 金山终端安全系统是一款为企业提供终端防护的安全产品&#xff0c;针对恶意软件、病毒和外部攻击提供防范措施&#xff0c;帮助维护企业数据和网络。 0x02 漏洞概述 金山终端安全系统V9.0 /inter/update_software_info_v2.php页面存在sql注入漏洞&#xff0c;该…...

Radius OTP完成堡垒机登录认证 安当加密

Radius OTP&#xff08;One-Time Password&#xff09;是一种用于身份验证的协议&#xff0c;它通过向用户发送一个一次性密码来验证用户的身份。使用Radius OTP可以实现堡垒机登录&#xff0c;以下是一些实现步骤&#xff1a; 1、安装Radius服务器 首先需要安装Radius服务器…...

ROS opencv 人脸识别

人脸识别需要在输入的图像中确定人脸&#xff08;如果存在&#xff09;的位置、大小和姿态&#xff0c;往往用于生物特征识别、视频监听、人机交互等应用中。2001年&#xff0c;Viola和Jones提出了基于Haar特征的级联分类器对象检测算法&#xff0c;并在2002年由Lienhart和Mayd…...

文心一言 4.0 ERNIE-Bot 4.0 :ERNIE-Bot 4.0 大模型深度测试体验报告

本心、输入输出、结果 文章目录 文心一言 4.0 ERNIE-Bot 4.0 &#xff1a;ERNIE-Bot 4.0 大模型深度测试体验报告前言相关跳转文心一言 4.0 ERNIE-Bot 4.0 接口简介Bash 请求示例代码Windows 模式使用 Python 请求如果直接使用官方提供的代码文心一言 4.0 ERNIE-Bot 4.0 API 在…...

华为OD机考B卷 | 100分】阿里巴巴找黄金宝箱(JAVA题解——也许是全网最详)

前言 本人是算法小白&#xff0c;甚至也没有做过Leetcode。所以&#xff0c;我相信【同为菜鸡的我更能理解作为菜鸡的你们的痛点】。 题干 1. 题目描述 一贫如洗的樵夫阿里巴巴在去砍柴的路上&#xff0c;无意中发现了强盗集团的藏宝地&#xff0c;藏宝地有编号从0~N的箱子&…...

请求转发和重定向区别

两者区别&#xff1a; 1.转发在一次请求中完成&#xff0c;重定向是两次请求 2.转发操作发生在服务器内部&#xff0c;重定向是在浏览器执行操作 3.转发地址栏不变&#xff0c;重定向地址栏变化&#xff08;两次请求&#xff0c;两个地址&#xff09; 4.转发可以在一次请求中共…...

JS如何判断对象为空?以及各自的缺点。

JS如何判断对象为空&#xff1f;以及各自的缺点。 Object.keys() 通过 Object.keys() 来获取对象的键进行判断。 function isEmpty(obj) {return Object.keys(obj).length 0; }console.log(isEmpty({})); // true console.log(isEmpty({ a: 1 })); // false缺点&#xff1a…...

同城代驾开源版小程序开发

同城代驾开源版小程序开发 功能特性描述&#xff1a; 定价模式&#xff1a;本系统支持灵活的计价模式&#xff0c;包括白天和夜晚的起步价、起步里程、每公里价以及超时费用&#xff0c;从而满足不同时段的定价需求。 实时路径计算&#xff1a;通过集成腾讯地图的软件开发工…...

【Python机器学习】零基础掌握ShrunkCovariance协方差估计

有没有想过如何准确地评估股票投资的风险? 在投资领域,了解各种资产(如股票、债券等)之间的相关性和波动性是非常重要的。常用的方法是计算资产收益率的协方差矩阵,但这个矩阵在样本量少或数据质量不高的情况下可能会产生误导。那么,有没有更好的方法来解决这个问题呢?…...

精神科常用评估量表汇总,建议收藏!

根据精神科医生的量表使用情况&#xff0c;笔者整理了10个精神科常用量表&#xff0c;可在线评测直接出结果&#xff0c;可转发使用&#xff0c;可生成二维码使用&#xff0c;可创建项目进行数据管理&#xff0c;有需要的小伙伴赶紧收藏&#xff01; 抑郁自评量表 抑郁自评量表…...

Python之切片

Python之切片 切片 通过给定的索引区间获得线性结构的一部分数据start、stop、step为整数&#xff0c;可以是正整数、负整数、零start为0时&#xff0c;可以省略stop为末尾时&#xff0c;可以省略step为1时&#xff0c;可以省略切片时&#xff0c;索引超过上界(右边界)&#…...

OpenCV显示中文(python)

OpenCV添加文字的方法putText(…)&#xff0c;添加英文是没有问题的&#xff0c;但如果你要添加中文就会出现“&#xff1f;&#xff1f;&#xff1f;”的乱码&#xff0c;需要特殊处理一下。 下文提供封装好的&#xff08;代码&#xff09;方法&#xff0c;供OpenCV添加中文使…...

k8s-18 认证授权

Authentication (认证) 认证方式现共有8种&#xff0c;可以启用一种或多种认证方式&#xff0c;只要有一种认证方式通过&#xff0c;就不再进行其它方式的认证。通常启用X509 Client Certs和Service Accout Tokens两种认证方式 Kubernetes集群有两类用户:由Kubernetes管理的Ser…...