当前位置: 首页 > 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…...

终极风扇控制指南:FanControl免费软件让你的电脑散热更智能

终极风扇控制指南&#xff1a;FanControl免费软件让你的电脑散热更智能 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trendi…...

aivectormemory:轻量级向量记忆库,为AI应用开发提供灵活存储方案

1. 项目概述&#xff1a;向量记忆库的“新玩家”最近在折腾AI应用开发&#xff0c;特别是涉及到需要让模型“记住”大量私有知识或者进行复杂对话的场景时&#xff0c;一个绕不开的核心组件就是向量数据库。大家熟知的Pinecone、Weaviate、Milvus这些方案固然强大&#xff0c;但…...

构建可进化智能体系统:从架构蓝图到工程实践

1. 项目概述与核心价值最近在开源社区里&#xff0c;一个名为planck-lab/hermes-evolving-agents-public-blueprint的项目引起了我的注意。这个标题乍一看有点长&#xff0c;但拆解一下就能发现它的分量&#xff1a;planck-lab是组织名&#xff0c;hermes是项目代号&#xff0c…...

LeetCode 01矩阵中距离题解

LeetCode 01矩阵中距离题解 题目描述 给定一个 01 矩阵&#xff0c;找到每个 0 到最近的 0 的距离。 示例&#xff1a; 输入&#xff1a;mat [[0,0,0],[0,1,0],[1,1,1]]输出&#xff1a;[[0,0,0],[0,1,0],[1,2,1]] 解题思路 方法&#xff1a;BFS 思路&#xff1a; 使用 BFS 从…...

C++ Lambda表达式实战指南:从捕获策略到现代C++最佳实践

1. Lambda表达式基础&#xff1a;从语法到核心概念 第一次接触C Lambda表达式时&#xff0c;我被它奇怪的方括号语法弄得一头雾水。直到在真实项目中用它简化了回调函数&#xff0c;才真正体会到它的威力。Lambda本质上就是个"即用即扔"的函数对象&#xff0c;特别适…...

Cursor AI编程助手扩展包:定制化规则提升代码生成质量与效率

1. 项目概述&#xff1a;一个为 Cursor 编辑器量身定制的 AI 编程助手扩展包如果你和我一样&#xff0c;日常重度依赖 Cursor 这款“AI 驱动的代码编辑器”来提升开发效率&#xff0c;那你肯定不止一次地想过&#xff1a;能不能让 Cursor 更懂我&#xff1f;能不能让它在我写特…...

HunterPie完全指南:如何在《怪物猎人世界》中获得实时数据监控优势

HunterPie完全指南&#xff1a;如何在《怪物猎人世界》中获得实时数据监控优势 【免费下载链接】HunterPie-legacy A complete, modern and clean overlay with Discord Rich Presence integration for Monster Hunter: World. 项目地址: https://gitcode.com/gh_mirrors/hu/…...

期权量化交易基础库:模块化设计与回测实战指南

1. 项目概述&#xff1a;一个为期权交易者打造的“地基” 如果你在量化交易或者期权策略开发领域摸爬滚打过一段时间&#xff0c;大概率会和我有同样的感受&#xff1a;每次想测试一个新想法&#xff0c;都得从零开始搭建数据接口、计算希腊字母、管理仓位、回测框架……这些重…...

3D打印操作辅助工具:自制安全高效的“过来放大器”

1. 项目概述&#xff1a;当3D打印遇上“过来”放大器在3D打印这个行当里折腾了这么多年&#xff0c;我见过各种稀奇古怪的“魔改”和“土法炼钢”&#xff0c;但最近一个朋友工作室里出现的一个小玩意儿&#xff0c;还是让我眼前一亮。他管它叫“3D打印设备专用过来放大器”。初…...

高层次综合百问

一、基础层Vivado HLS 的核心功能是什么&#xff1f;它与 Vivado 的核心区别是什么&#xff1f;HLS 中“可综合 C 代码”和普通软件 C 代码的最核心区别是什么&#xff1f;Vivado HLS 支持的输入语言有哪些&#xff08;至少说出3种&#xff09;&#xff1f;HLS 工程的基本组成部…...