All the code I have read so far this, that are using
start = mid + 1 to deal with edge case when nums is [2,1] or [3,1].
It is extremely confusing. Reading those people's code is basically wasting my life.
and of course, you have used start = mid + 1 to make your code 1% shorter but 1000% less comprehensible.
class Solution(object): def findMin(self, nums): low, upper = 0, len(nums)-1 # case like empty nums or None if len(nums) == 0: return 0 # case when length is 1 if len(nums) == 1: return nums # case when length of nums >=2 # low+1 = upper make sure all the case side length > 2 while low+1 <= upper: mid = low + (upper-low)/2 #case [2,3] or [1,3] if low+1 == upper: return min(nums[low],nums[upper]) if nums[low] < nums[upper]: # case it is already in sorted order 1,2,3 return nums[low] if nums[mid] > nums[upper]: # case like [7,8,1,2,3,4,5] ; in general nums[low] > nums[mid] < nums[upper] low = mid elif nums[mid] < nums[upper]: # case like [7,8,1,2,3,4,5] , in general nums[low] < nums[mid] >nums[upper] upper = mid # we dont need return because all case has already been considered