把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
我的代码:二分法
class min:
def solution(self,nums):
a = nums[0]
b = nums[-1]
if len(nums) == 1:
return nums[0]
elif len(nums) == 0:
return None
elif a<b:
return a
else:
while nums.index(b)-nums.index(a)!= 1 :
while nums[(nums.index(a)+nums.index(b))//2]>a:
a = nums[(nums.index(a)+nums.index(b))//2]
while nums[(nums.index(a)+nums.index(b))//2]<b:
b = nums[(nums.index(a)+nums.index(b))//2]
return b
看上去很繁琐,而且为什么不直接用指针?我的代码有很多重复步骤。
别人的代码:
class Solution:
def findMin(self, nums: List[int]) -> int:
left = 0
right = len(nums) - 1
while left < right:
mid = left + (right - left) // 2
if nums[right] < nums[mid]:
left = mid + 1
else:
right = mid
return nums[left]
作者:powcai
链接:https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array/solution/er-fen-by-powcai-2/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
逻辑很清晰:
二分法, 二分法就是找与mid判断条件,这里我们选用right
当nums[mid] > nums[right]说明在mid左半边的递增区域, 说明最小元素在> mid区域
当nums[mid] <= nums[right说明在mid右半边的递增区域, 说明最小元素在<= mid区域
小技巧:
一般是这样,
当while left < right是循环外输出
当while left <= right是循环里输出