剑指 Offer 11. 旋转数组的最小数字
本题与154题相同,重做一遍还是有细节问题
思路:
1. 本题需要找最小数字,在本升序数组中,需想通最小数字就是旋转点
2. 接着就是二分法
1) left,right = 0 , len(nums)-1
2) mid = left + (right-left)//2 这种写法是防止 (right+left) >>1 太大溢出
3. 细节:
1) 首先明确在此题中,mid要与right比,而不能与Left比 (我也不知道为啥,用Left就出错)
2) 然后是 左右端点的赋值,千万不能用 left = mid+1, right = mid-1 这种将mid直接跳过去;如果是找target ,nums[mid] != target 可以跳过去
3)所以,这里要用 left = mid + 1 ,right = mid。
这是因为mid<right时,有可能mid就是最小值,所以要保留它,写作 right = mid
而我们的mid取的是左中点,如果更新时写作 left = mid 就永远跳不出去了; 比如 left,right = 2,3 每次mid = 2
if numbers[mid]<numbers[right]:
right = mid
elif numbers[mid]>numbers[right]:
left = mid+1