前言 今天继续算法题:旋转数组的题解最小数字 题目:旋转数组的最小数字 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转数组旋转。输入一个递增排序的数字数组的一个旋转,输出旋转数组的题解最小元素。例如,旋转数组数组 [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 解法一 首先找到题目的提干: 递增排序数组(可以重复),旋转,数字最小元素 也就是题解一个递增数组,将一部分移动到数组尾部,旋转数组比如: 找到其中的最小数字。 那么我们很容易想到的题解第一中解法就是遍历数组,然后找到某一个数字比它前面一个数字小的旋转数组时候,那么这个数字就是数字我们要找的最小数字。 因为正常来说都是云服务器提供商后面数字大于前数字,所以出现小于前数字,那么就是这个旋转数组的分界点,也就是最小数字了。 方法消耗情况 以后不写这个了。由于每次测试用例不同,造成的结果也相差太大,没有参考性。 时间复杂度 遍历一次数组,所以时间复杂度为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了。 其中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/ 本文转载自微信公众号「 码上积木」,可以通过以下二维码关注。服务器租用转载本文请联系 码上积木公众号。