leetcode 153. 寻找旋转排序数组中的最小值(优质解法)

2023-12-15 14:28

本文主要是介绍leetcode 153. 寻找旋转排序数组中的最小值(优质解法),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

代码:

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

题解:

        通过题意我们知道,传入的参数是经过旋转的递增数组,如 3,4,5,1,2,就是通过 1,2,3,4,5 旋转得到的,而这种旋转数组的特性我们可以通过一张图清晰的看出来,以 3,4,5,1,2 为例


        我们可以看出旋转以后的递增数组大多呈现这样的结构,我们将数据分为了两个区间,而需要获取的答案位于下面区间的左边界

        我们可以以数组的最后一个数据作为 refer 参照,在数组中选取一个数 nums[ i ],这个数可能会位于上面和下面两个区间

        (1).当 nums[ i ] > refer 时,说明该数位于上面的区间,那我们就可以大胆去除掉 i 下标指向的数据以及左边的数据

        (2).当 nums[ i ] <= refer 时,说明该数位于下面的区间,那我们就可以大胆去除掉 i 下标右边的数据(但我们不能确定 i 下标指向的是否刚好是我们需要的数据,所以我们不能去除掉 i 下标指向的数据)

        通过上面的分析,我们已经能够确定,该题目具有二段性,所以我们可以通过二分法来解决该问题

        以 nums = 3,4,5,1,2 为例,用 L 和 R 指针指向数组的两端,mid = left+(right-left)/2= 2 .此时 R 指针指向的刚好是数组的最后一个数据,我们可以顺便记录起来,作为参照值,refer = nums[ R ] = 2

        此时 nums[ mid ] = 5 > refer,所以在上面的区间,我们就可以大胆去除 mid 指针以及 mid 指针左边的数据,让 L = mid+1

3        4        5        1        2

L                 mid               R

        计算中间值 mid = 3,此时 nums[ mid ] = 1 < refer, 所以在下面的区间,我们就可以大胆去除 mid 右边的数据,让 R =mid 

3        4        5        1        2

                               L       R

                              mid 

        当 L 和 R 指针相遇时,我们便找到了下面区间的左边界,直接返回 nums[ L ] 即可

3        4        5        1        2

                               L       

                               R

这篇关于leetcode 153. 寻找旋转排序数组中的最小值(优质解法)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/496755

相关文章

Java数组动态扩容的实现示例

《Java数组动态扩容的实现示例》本文主要介绍了Java数组动态扩容的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1 问题2 方法3 结语1 问题实现动态的给数组添加元素效果,实现对数组扩容,原始数组使用静态分配

Python结合Free Spire.PDF for Python实现PDF页面旋转

《Python结合FreeSpire.PDFforPython实现PDF页面旋转》在日常办公或文档处理中,我们经常会遇到PDF页面方向错误的问题,本文将分享如何用Python结合FreeSpir... 目录基础实现:单页PDF精准旋转完整代码代码解析进阶操作:覆盖多场景旋转需求1. 旋转指定角度(90/27

Java Map排序如何按照值按照键排序

《JavaMap排序如何按照值按照键排序》该文章主要介绍Java中三种Map(HashMap、LinkedHashMap、TreeMap)的默认排序行为及实现按键排序和按值排序的方法,每种方法结合实... 目录一、先理清 3 种 Map 的默认排序行为二、按「键」排序的实现方式1. 方式 1:用 TreeM

JavaScript对象转数组的三种方法实现

《JavaScript对象转数组的三种方法实现》本文介绍了在JavaScript中将对象转换为数组的三种实用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录方法1:使用Object.keys()和Array.map()方法2:使用Object.entr

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

C++归并排序代码实现示例代码

《C++归并排序代码实现示例代码》归并排序将待排序数组分成两个子数组,分别对这两个子数组进行排序,然后将排序好的子数组合并,得到排序后的数组,:本文主要介绍C++归并排序代码实现的相关资料,需要的... 目录1 算法核心思想2 代码实现3 算法时间复杂度1 算法核心思想归并排序是一种高效的排序方式,需要用

Java中数组与栈和堆之间的关系说明

《Java中数组与栈和堆之间的关系说明》文章讲解了Java数组的初始化方式、内存存储机制、引用传递特性及遍历、排序、拷贝技巧,强调引用数据类型方法调用时形参可能修改实参,但需注意引用指向单一对象的特性... 目录Java中数组与栈和堆的关系遍历数组接下来是一些编程小技巧总结Java中数组与栈和堆的关系关于

Java中的数组与集合基本用法详解

《Java中的数组与集合基本用法详解》本文介绍了Java数组和集合框架的基础知识,数组部分涵盖了一维、二维及多维数组的声明、初始化、访问与遍历方法,以及Arrays类的常用操作,对Java数组与集合相... 目录一、Java数组基础1.1 数组结构概述1.2 一维数组1.2.1 声明与初始化1.2.2 访问

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方