LeetCode题练习与总结:寻找旋转排序数组中的最小值--153

一、题目描述

已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums = [0,1,2,4,5,6,7] 在变化后可能得到:

  • 若旋转 4 次,则可以得到 [4,5,6,7,0,1,2]
  • 若旋转 7 次,则可以得到 [0,1,2,4,5,6,7]

注意,数组 [a[0], a[1], a[2], ..., a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], ..., a[n-2]] 。

给你一个元素值 互不相同 的数组 nums ,它原来是一个升序排列的数组,并按上述情形进行了多次旋转。请你找出并返回数组中的 最小元素 。

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

示例 1:

输入:nums = [3,4,5,1,2]
输出:1
解释:原数组为 [1,2,3,4,5] ,旋转 3 次得到输入数组。

示例 2:

输入:nums = [4,5,6,7,0,1,2]
输出:0
解释:原数组为 [0,1,2,4,5,6,7] ,旋转 3 次得到输入数组。

示例 3:

输入:nums = [11,13,15,17]
输出:11
解释:原数组为 [11,13,15,17] ,旋转 4 次得到输入数组。

提示:

  • n == nums.length
  • 1 <= n <= 5000
  • -5000 <= nums[i] <= 5000
  • nums 中的所有整数 互不相同
  • nums 原来是一个升序排序的数组,并进行了 1 至 n 次旋转

二、解题思路

这个问题是典型的二分查找的变种问题。由于原数组是升序排列的,即使经过旋转,数组也被分成了两个有序的部分。最小值就是这两个部分的分界点。

以下是解决这个问题的步骤:

1. 初始化两个指针,left指向数组的起始位置,right指向数组的末尾。

2. 进行二分查找,计算中间位置mid

3. 检查mid位置的值是否是最小值,或者通过比较midright位置的值来确定最小值是在左半部分还是右半部分。

  • 如果nums[mid] > nums[right],说明最小值在mid的右侧,设置left = mid + 1
  • 否则,最小值在mid的左侧或就是mid,设置right = mid

4. 当left等于right时,找到了最小值,返回nums[left]nums[right]

三、具体代码

class Solution {public int findMin(int[] nums) {int left = 0, right = nums.length - 1;while (left < right) {int mid = left + (right - left) / 2;if (nums[mid] > nums[right]) {left = mid + 1;} else {right = mid;}}return nums[left];}
}

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

1. 时间复杂度
  • 我们使用了一个while循环,该循环的每次迭代都会将搜索区间减半。
  • 在每次迭代中,我们只做常数时间的工作,即计算mid、比较和赋值。
  • 因此,循环会运行log n次,其中n是数组的长度。
  • 综上,时间复杂度是O(log n)。
2. 空间复杂度
  • 该算法只使用了几个变量(left, right, mid),不管输入数组的大小如何,所使用的额外空间都保持不变。
  • 因此,空间复杂度是O(1),即常数空间复杂度。

五、总结知识点

1. 二分查找(Binary Search):

  • 二分查找是一种高效的查找算法,它将查找区间分成两半,每次比较中间元素与目标值,根据比较结果选择左半区间或右半区间继续查找,直到找到目标值或区间为空。
  • 在这个问题中,二分查找被用于找到旋转数组中的最小值,即使数组被旋转,我们也可以通过比较中间元素和最右侧元素来确定最小值是在左半部分还是右半部分。

2. 循环(Loop):

  • 使用了一个while循环来实现二分查找。循环的条件是左指针小于右指针,这表示查找区间非空。

3. 整数运算(Integer Operations):

  • 计算中间位置mid时使用了整数除法和加法。为了避免整数溢出,使用了(left + (right - left) / 2)而不是(left + right) / 2

4. 数组操作(Array Operations):

  • 通过索引访问数组元素,比较数组中不同位置的值。

5. 递归与迭代(Recursion and Iteration):

  • 虽然这段代码使用的是迭代方法,但二分查找也可以用递归方式实现。在这个问题中,迭代是更常见和更高效的实现方式。

6. 算法设计技巧(Algorithm Design Techniques):

  • 利用数组的局部有序性质来减少查找范围,这是分治策略的一个例子。

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

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

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

相关文章

【MIT 6.5840/6.824】Lab1 MapReduce

MapReduce MapReduce思想实现思路感受 6.5840/6.824 Lab与笔记汇总 本文对应的Lab版本为MIT6.5840-Spring2024的Lab1 本博客只提供思路&#xff0c;不会公开任何代码 本lab耗时约6h&#xff0c;码量约500行 MapReduce思想 MapReduce的思想属于是比较简单的&#xff0c;分为两…

3. 排序算法代码-python

目录 1.冒泡排序2.快速排序3.插入排序4.希尔排序5.选择排序6.堆排序7.归并排序8. 二分查找 1.冒泡排序 冒泡排序""" def BubbleSort(nums):listLength len(nums)while listLength > 0:for i in range(listLength - 1):if nums[i] > nums[i1]:nums[i], n…

References in code to package

【IntelliJ IDEA】IDE学习使用&#xff08;不时更新&#xff09;_idea references in code to class-CSDN博客

【笔记】从零开始做一个精灵龙女-画贴图阶段(上)

此文只是我的笔记&#xff0c;不包全看懂&#xff0c;有问题可评论 PS贴图加工 1.打开ps 拖入uv图&#xff0c;新建图层&#xff0c;设置背景色为灰色&#xff0c;改一下图层名字 2.按z缩小一下uv图层&#xff0c;拖入实体uv图片&#xff08;目的是更好上色&#xff0c;比如…

鸿蒙语言基础类库:【@ohos.util.Vector (线性容器Vector)】

线性容器Vector 说明&#xff1a; 本模块首批接口从API version 8开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。开发前请熟悉鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 Vect…

云原生(Cloud native)

云原生&#xff08;Cloud native&#xff09; 一 定义 目前比较权威的定义主要来自Pivotal公司和云原生计算基金会&#xff08;Cloud Native Computing Foundation&#xff0c;简称CNCF&#xff09;。 1.1 Pivotal 4个要点&#xff1a; DevOps、持续交付、微服务、容器化。六…

【Java后端】Service层读取yml配置文件中内容

前言 最近写代码&#xff0c;看到别人写的读取application.yml配置文件中数据&#xff0c;写的挺规范&#xff0c;挺好的&#xff1b;虽然之前也读取过yml文件&#xff0c;但用的其他方法&#xff0c;没这个规范&#xff0c;所以记录下 正文 假设要读取视频地址&#xff0c;…

微信小程序切换商户号

1.登录微信公众平台小程序 2.功能->微信支付 3.关联成功后会志一关联商户号列表显示 4.登录你需要切换的商户号 在下面选择你需要开通的产品服务 5.切换到账户中心的api安全里面 只需要改变当前下面的配置即可切换小程序的收款商户号 申请API证书按照官方的指引即可解…

关于redis的运维面试题-2

21. Redis的客户端连接数限制如何设置&#xff1f; 在Redis中&#xff0c;客户端连接数的限制可以通过配置文件redis.conf来设置&#xff0c;也可以通过命令行直接设置。以下是如何通过配置文件和命令行来设置Redis客户端连接数限制的步骤和示例代码。 通过配置文件设置客户端…

JS计算某一年的土地租金收入和土地承租支出

涉及到多年的地租 , 例如 2024年5月15日 - 2026年5月15日 , 总承包租金是60000 假设 当前年是2024年 , 则计算2024年5月15日-2024年12月31日的租金收入 , 如果是2025年则是2025年1月1日-2025年12月31日 //示例交易数据 var transactions [ { type: "转出土地收益&qu…

怎么区分住宅IP还是机房IP?机房IP和住宅IP有哪些不同?

在网络技术的应用中&#xff0c;IP地址扮演着至关重要的角色。了解IP地址的种类及其特性&#xff0c;对于进行网络管理、优化网络安全策略、以及实施数据分析等任务至关重要。本文将深入探讨如何区分住宅IP和机房IP&#xff0c;并分析两者的主要差异。 一、IP地址分类简介 IP…

pytorch-RNN存在的问题

这里写目录标题 1. RNN存在哪些问题呢&#xff1f;1.1 梯度弥散和梯度爆炸1.2 RNN为什么会出现梯度弥散和梯度爆炸呢&#xff1f; 2. 解决梯度爆炸方法3. Gradient Clipping的实现4. 解决梯度弥散的方法 1. RNN存在哪些问题呢&#xff1f; 1.1 梯度弥散和梯度爆炸 梯度弥散是…

【人工智能】深度学习:神经网络模型

【人工智能】深度学习&#xff1a;神经网络模型 神经网络基础知识 BP神经网络的概念 单个神经元的结构 CNN模型汇总 LeNet5 模型 AlexNet 模型 VGG模型 Inception Net&#xff08;GoogleNet&#xff09;模型 ResNet &#xff08;残差网络&#xff09; RNN模型&#x…

css实现渐进中嵌套渐进的方法

这是我们想要的实现效果&#xff1a; 思路&#xff1a; 1.有一个底色的背景渐变 2.需要几个小的块级元素做绝对定位通过渐变filter模糊来实现 注意&#xff1a;这里的采用的定位方法&#xff0c;所以在内部的元素一律要使用绝对定位&#xff0c;否则会出现层级的问题&…

小白攻克歌曲“无名的人”,逐句精研的歌唱诀窍

《无名的人》 作词&#xff1a;唐恬 作曲&#xff1a;钱雷 演唱&#xff1a;毛不易 今天不讲解练习技巧&#xff0c;有需要的可以查看往期文章&#xff0c;我给大家带一下无名的人&#xff0c;练习一下情感融入。 对于众多唱歌小白而言&#xff0c;学习歌曲《无名的人》是一…

ctfshow-web入门-文件上传(web164、web165)图片二次渲染绕过

web164 和 web165 的利用点都是二次渲染&#xff0c;一个是 png&#xff0c;一个是 jpg 目录 1、web164 2、web165 二次渲染&#xff1a; 网站服务器会对上传的图片进行二次处理&#xff0c;对文件内容进行替换更新&#xff0c;根据原有图片生成一个新的图片&#xff0c;这样…

【Linux】进程优先级 + 环境变量

前言 在了解进程状态之后&#xff0c;本章我们将来学习一下进程优先级&#xff0c;还有环境变量等。。 目录 1.进程优先级1.1 为什么要有优先级&#xff1f; 2.进程的其他概念2.1 竞争性与独立性2.2 并行与并发2.3 进程间优先级的体现&#xff1a;2.3.1 O(1) 调度算法&#xf…

Apache Web安全分析与增强

Apache HTTP Server 概述 Apache HTTP Server(通常简称为Apache)是一个开源的Web服务器软件,由Apache软件基金会开发和维护。它是全球使用最广泛的Web服务器之一,支持多种操作系统,包括Unix、Linux、Windows和Mac OS X。以下是Apache Web服务器的详细概述,包括其功能特点…

数字高压表0-30kv

最近在制作数字高压表&#xff0c;自己DIY玩玩&#xff0c;有没有朋友一起研究看看

SpringCloud--常用组件和服务中心

常用组件 Euroke和nacos 区别 负载均衡 负载均衡策略有哪些 自定义负载均衡策略