首页 > 其他分享 >LeetCode 剑指 Offer 11. 旋转数组的最小数字

LeetCode 剑指 Offer 11. 旋转数组的最小数字

时间:2023-07-12 14:13:32浏览次数:50  
标签:11 Offer nums mid 旋转 numbers 数组 else LeetCode

题目链接:LeetCode 剑指 Offer 11. 旋转数组的最小数字

题意:

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。

给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一次旋转,该数组的最小值为 1。

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

解题思路:

数组中找最小值,使用 O(n) 时间复杂度的算法没什么好说的,
题干给的是一个有序的数组,所以可以使用性能更优的二分查找来做

二分查找

只有中点和右端点比较大小,才能确定哪边属于连续递增数组
存在三种情况:

  1. 中间值比最右值大,最小元素肯定出现在右半部分,且肯定不是中间值 [3,4,5,1,2]
  2. 中间值比最右值小,最小元素肯定出现在左半部分,且可能是中间值 [1,2,3,4,5]
  3. 中间值和最右值相等,可能是 [1,1,1,2,1],也可能是 [1,1,1,0,1],所以只有缩小范围再试试

代码1:

func minArray(nums []int) int {
    l, r := 0, len(nums)-1
    for l < r {
        mid := l + (r-l) >> 1
        if nums[mid] > nums[r] {
            l = mid+1
        } else if nums[mid] < nums[r] {
            r = mid
        } else {
            r--
        }
    }
    return nums[l]
}

代码2:

func minArray(numbers []int) int {
    if len(numbers) == 0 {
        return - 1
    }
    // 直接进行二分操作,划分的区间是 [l,mid] [mid+1,r]
    l := 0
    r := len(numbers) - 1
    for l < r {      
        mid := (l + r) / 2
        if numbers[mid] > numbers[r] {  //则最小值在右半部分
            l = mid + 1
        }else if numbers[mid] < numbers[r] {  //最小值在左半部分
            r = mid
        }else{
            r--   //如果相等,不确定在哪里,只能缩小范围进一步筛选
        }
    }
    // 循环退出时,l == r
    return numbers[l] 
}

YZ 的思路:使用中间值 mid 与旋转后的数据的第一个元素进行比较,(需要判断的情况比较多,没有与最右边比较好理解)

标签:11,Offer,nums,mid,旋转,numbers,数组,else,LeetCode
From: https://www.cnblogs.com/lxing-go/p/17547320.html

相关文章

  • LeetCode 剑指 Offer 12. 矩阵中的路径
    题目链接:LeetCode剑指Offer12.矩阵中的路径题意:给定一个 mxn二维字符网格 board和一个字符串单词 word。如果 word存在于网格中,返回true;否则,返回false。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元......
  • 【雕爷学编程】Arduino动手做(117)---P10V706LED屏模组4
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞......
  • 【雕爷学编程】Arduino动手做(117)---P10V706LED屏模组3
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞......
  • 【雕爷学编程】Arduino动手做(117)---P10V706LED屏模组2
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞......
  • LeetCode 234. 回文链表
    classSolution{public:ListNode*reverse(ListNode*head)//翻转以head为头节点的链表{if(!head||!head->next)returnhead;autoa=head,b=head->next;while(b){autoc=b->next;b->next=a;......
  • 111
    # 模型服务ws代理server {        listen       7502;        server_name  localhost;                location ~ ^/b(\d*)m(\d*)e([\w]*) {                #proxy_pass http://10.0.125.70:$1$2;      ......
  • LeetCode -- 918. 环形子数组的最大和
     遇到环形问题一般有两种考虑方法:1.破环成链2.分为数组中间部分和数组两边部分分别考虑本题采用第二种考虑方法,将原数组分为中间部分和两边部分分别考虑。中间部分即为子数组最大和,两边部分计总和减去中间部分最小和。classSolution{public:intma......
  • Ubuntu资源暂时不可用 E: 无法获得锁 /var/lib/dpkg/lock-frontend - open (11: 资源
    ubuntu使用apt时出现Ubuntu资源暂时不可用E:无法获得锁/var/lib/dpkg/lock-frontend-open(11:资源暂时不可用)一般是已经存在apt进程占用了,通过ps-grep查看ps-grep|apt查到相关进程后通过kill删掉kill-93298kill-93302再依次执行下面命令sudorm/var/cache......
  • LeetCode 热题 100 之 128. 最长连续序列
    题目描述给定一个未排序的整数数组nums,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为 O(n)的算法解决此问题。示例1:输入:nums=[100,4,200,1,3,2]输出:4解释:最长数字连续序列是[1,2,3,4]。它的长度为4。示例2:输入:nums......
  • LeetCode -- 826. 安排工作以达到最大收益
     方法一:二分加枚举通过二分快速查找小于某个难度值的最大价值。classSolution{public:intmaxProfitAssignment(vector<int>&difficulty,vector<int>&profit,vector<int>&worker){constintn=(int)difficulty.size();vector<pai......