文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

LeetCode题解之旋转数组的数字

2024-12-03 13:04

关注

前言

今天继续算法题:旋转数组的最小数字

题目:旋转数组的最小数字

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。

示例 1:

输入:[3,4,5,1,2] 输出:1 示例 2:

输入:[2,2,2,0,1] 输出:0

解法一

首先找到题目的提干:

递增排序数组(可以重复),旋转,最小元素

也就是一个递增数组,将一部分移动到数组尾部,比如:

  1. [1,2,3,4,5] 
  2. //旋转之后 
  3. [3,4,5,1,2] 

找到其中的最小数字。

那么我们很容易想到的第一中解法就是遍历数组,然后找到某一个数字比它前面一个数字小的时候,那么这个数字就是我们要找的最小数字。

因为正常来说都是后面数字大于前数字,所以出现小于前数字,那么就是这个旋转数组的分界点,也就是最小数字了。

  1. class Solution { 
  2.     public int minArray(int[] numbers) { 
  3.         for(int i=0;i
  4.             if(numbers[i]>numbers[i+1]){ 
  5.                 return numbers[i+1]; 
  6.             } 
  7.         } 
  8.         return numbers[0]; 
  9.     } 

方法消耗情况

以后不写这个了。由于每次测试用例不同,造成的结果也相差太大,没有参考性。

时间复杂度

遍历一次数组,所以时间复杂度为O(n)

空间复杂度

没有用到另外的空间,所以空间复杂度为O(1)

解法二

二分法。

有的人可能会疑惑,二分法不是用来查找顺序数组的吗,这个旋转之后也算吗?

我们回顾下二分法的关键点就是:

取任意一个关键数字,都能通过判断 来确定在我们要的值在哪个区间(关键数字的前后)。

那么在我们的旋转数组中,能做到这一点吗?

比如我们取中间值a和最后值b,如果a大于b,就说明这个分界值在这a和b之间,a之前的数据是正确排序的。

如果a小于b,说明分界值在a之前,a到b之间的数据是正确排序的。

比如刚才的[3,4,5,1,2],中间值5大于最后的值2,说明分界值在5和2之间,也就是1了。

  1. class Solution { 
  2.     public int minArray(int[] numbers) { 
  3.         int left=0; 
  4.         int right=numbers.length-1; 
  5.         //二分法查找条件 
  6.         while(left<right){ 
  7.             //找到中间点 
  8.             int mid=left+(right-left)/2; 
  9.             if(numbers[mid]right]){ 
  10.                 right=mid; 
  11.             }else if(numbers[mid]>numbers[right]){ 
  12.                 left=mid+1; 
  13.             }else
  14.                 right--; 
  15.             } 
  16.         } 
  17.         return numbers[left]; 
  18.     } 

其中right=mid,left=mid+1的原因是因为,当numbers[mid]

而numbers[mid]>numbers[right]的情况下,mid不可能为最小,所以设置为mid+1。

时间复杂度

二分法最坏情况:

n/(2的x次方)=1,x=long2n。所以时间复杂度为O(longn)

还有一种情况是所有元素全部相同,这种情况下每次都执行right-1,所以时间复杂度为O(n)

空间复杂度

没有用到另外的空间,所以空间复杂度为O(1)

参考

https://leetcode-cn.com/problems/xuan-zhuan-shu-zu-de-zui-xiao-shu-zi-lcof/submissions/

本文转载自微信公众号「 码上积木」,可以通过以下二维码关注。转载本文请联系 码上积木公众号。

 

来源:码上积木内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯