LeetCode题解之怎么实现旋转数组的数字

这篇文章主要介绍“LeetCode题解之怎么实现旋转数组的数字”,在日常操作中,相信很多人在LeetCode题解之怎么实现旋转数组的数字问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”LeetCode题解之怎么实现旋转数组的数字”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

成都创新互联公司是一家朝气蓬勃的网站建设公司。公司专注于为企业提供信息化建设解决方案。从事网站开发,网站制作,网站设计,网站模板,微信公众号开发,软件开发,小程序开发,十载建站对咖啡厅设计等多个领域,拥有多年的网站制作经验。

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

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组  [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,2,3,4,5] //旋转之后 [3,4,5,1,2]

找到其中的最小数字。

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

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

class Solution {     public int minArray(int[] numbers) {         for(int i=0;inumbers[i+1]){                 return numbers[i+1];             }         }         return numbers[0];     } }

方法消耗情况

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

时间复杂度

遍历一次数组,所以时间复杂度为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了。

class Solution {     public int minArray(int[] numbers) {         int left=0;         int right=numbers.length-1;         //二分法查找条件         while(leftnumbers[right]){                 left=mid+1;             }else{                 right--;             }         }         return numbers[left];     } }

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

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

到此,关于“LeetCode题解之怎么实现旋转数组的数字”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注创新互联网站,小编会继续努力为大家带来更多实用的文章!


网页标题:LeetCode题解之怎么实现旋转数组的数字
当前网址:http://pwwzsj.com/article/ihsjjp.html