首页 > 其他分享 >153. 寻找旋转排序数组中的最小值(中)

153. 寻找旋转排序数组中的最小值(中)

时间:2024-03-10 14:56:48浏览次数:25  
标签:153 right nums mid 旋转 最小值 数组 排序 输入

目录

题目

  • 已知一个长度为 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 次得到输入数组。

题解:二分

  • 结论:数组元素重复时,将 mid 与 mid+1或mid-1 进行比较来缩小范围;数组元素不重复时,将 mid 与 left或right进行比较来缩小范围。
  • 原因:数组元素重复,峰值或最小值可能出现在连续的相同元素之间,所以我们需要将 mid 与 mid+1 或mid-1进行比较来缩小查找范围。
class Solution:
    def findMin(self, nums: List[int]) -> int:
        left, right = 0, len(nums) - 1    
        while left <= right:                    # 循环的条件选为左闭右闭区间left <= right
            mid=left+(right-left)//2
            if nums[mid] >= nums[right]:        # 注意是当中值大于等于右值时,不加等号会陷入死循环    
                left = mid + 1                  # 将左边界移动到中值的右边
            else:                               # 当中值小于右值时
                right = mid                     # 将右边界移动到中值处
        return nums[right]                      # 最小值返回nums[right]

标签:153,right,nums,mid,旋转,最小值,数组,排序,输入
From: https://www.cnblogs.com/lushuang55/p/18062434

相关文章

  • java中的排序函数
    1.Arrays.sort()函数使用Arrays.sort()对数组进行排序一维数组升序如果是基本数据类型和对应的包装类:使用java.util.Arrays包的Arrays.sort()函数即可。一维数组降序如果是基本数据类型,则要先转成对应的包装类:在Arrays.sort()的第二个参数添加即可Collections.reverseOrder()......
  • 7-10 英文单词排序(string类型的长度表示方法)
    7-10英文单词排序分数15作者张泳单位浙大城市学院本题要求编写程序,输入若干英文单词,对这些单词按长度从小到大排序后输出。如果长度相同,按照输入的顺序不变。输入格式:输入为若干英文单词,每行一个,以#作为输入结束标志。其中英文单词总数不超过20个,英文单词为长度小于10的......
  • abc217E 带排序的查询
    题面:初始时有个空序列A,接下来有Q组操作,每个操作的格式如下:1x,将x追加到A的末尾。2,输出A开头的元素值,并移除。请求时保证A非空。3,对A中元素从小到大排序。范围:Q<=2E5;x<=1E9思路:用一个队列来维护还没有排序的元素,再用一个优先队列来维护已排序的元素。由于每次只能追加到末......
  • 【力扣】子集II(回溯法)(排序函数的一种隐藏用法?)
    题目描述可以套回溯模版的题,但是在写的过程中发现,如果数组中有多个相同元素分散存在的话,就会有一些子集无法得到像这里的1,4,4,如果对数组从左到右枚举的话是无论如何都得不到的。对这样的数组使用排序函数后,造成的效果就是相同的元素都堆在了一起,这样就能正确地得到所有子集......
  • 冒泡排序时间复杂度分析
    冒泡排序(升序)时间复杂度分析原理:通过从前往后遍历两两对比,当前一个数大于后一个数,则交换位置,最大的数可以遍历到最右侧不断从后缩小数组范围(end--),当end到第一个元素时停止voidSwap(int*a,int*b){inttmp=*b;*b=*a;*a=tmp;}voidBubbleSort(int*arr,i......
  • 快速排序
    快速排序-V1一、代码实现1.大致思路假如有一个数,这个数组自然有序假如有2个数,我们选第一个数为标准,比它小的数排它前面,比它大排后面,那么这两个数将有序。假如有3个数,我们选第一个数为标准,比它小的数排它前面,比它大排后面。假如有4个数,我们选第一个数为标准,比它小的数排它前......
  • 归并排序
    归并排序分析一、代码实现voidmerge(int*a,intlow,intmid,inthigh){int*b=newint[high-low+1];inti=low,j=mid+1,k=0;while(i<=mid&&j<=high){if(a[i]<a[j]){b[k++]=a[i++];}elseb[k++]=a......
  • Shell排序复杂度分析
    Shell排序复杂度分析1.大致思想可以把希尔排序看作是发牌员,给每人轮流发一张牌。需要给n个人发牌,每人从第二张开始分别进行插入排序,那么第一轮下来后,每人的牌就是有序的。接下来按照刚刚的发牌顺序把牌再收起来,减少人数,不断重复这个步骤,直到只剩下一个人,那么就是直接插入排序......
  • MYSQL学习笔记9: DQL排序查询(升降序)
    DQL排序查询select字段列表from表名orderby字段1排序方式1,字段2排序方式2;排序方式ASC升序(默认)DESC降序如果是多字段排序,第一个字段值相同,会根据第二个字段的值进行排序,以此类推按年龄降序排序select*fromworkersorderbyagedesc;......
  • 通达信超金钻大涨排序指标公式源码
    {通达信超金钻大涨排序指标公式源码}X_1:=DYNAINFO(15)/DYNAINFO(4)/FINANCE(46)*(DYNAINFO(4)-REF(CLOSE,1))/REF(CLOSE,1)*10000;今开%:=(OPEN/REF(CLOSE,1)-1)*100;X_7:=CLOSE>=ZTPRICE(REF(CLOSE,1),0.1);X_8:=BArslAstCOUNT(X_7);昨日涨停次数:REF(X_8,1),NODRAW;X_......