【S】O-11.旋转数组的最小数字
题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1
题解
可以忽略的Method
直接排序return最小…完全不看题作答但也可以通过,和直接min(numbers)一样好笑
!正经Method
参考链接:写的很好的题解
循环二分
排序数组的查找问题首先考虑使用 二分法 解决,其可将 遍历法 的 线性级别 时间复杂度降低至 对数级别 。
如下图所示,寻找旋转数组的最小元素即为寻找 右排序数组 的首个元素 nums[x] ,称 x为 旋转点 。
- 初始化
声明 ii, jj 双指针分别指向 numsnums 数组左右两端; - 循环二分
设 m = (i + j) / 2为每次二分的中点( “/” 代表向下取整除法,因此恒有 i ≤m<j ),可分为以下三种情况:
当nums[m]>nums[j] 时: m 一定在 左排序数组 中,即旋转点 x 一定在 [m +1,j] 闭区间内,因此执行 i = m + 1;
当 nums[m] < nums[j] 时: m 一定在 右排序数组 中,即旋转点 x一定在[i,m] 闭区间内,因此执行 j = m;
当 nums[m] =nums[j] 时: 无法判断 mm 在哪个排序数组中,即无法判断旋转点 x 在 [i,m] 还是 [m+1,j] 区间中。解决方案: 执行 j = j - 1缩小判断范围。 - 返回值:
当 i =j 时跳出二分循环,并返回旋转点的值nums[i] 即可
图解示例
class Solution:
def minArray(self, numbers: List[int]) -> int:
i,j=0,len(numbers)-1
while(i!=j):
m=(i+j)//2
if(numbers[m]>numbers[j]):
i=m+1
elif(numbers[m]<numbers[j]):
j=m
else:
j=j-1
return numbers[i]
结果
–2020/12/16-一开始抖机灵通过的method憨憨本人–