把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{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是循环里输出