41 lines
870 B
Python
41 lines
870 B
Python
|
|
arr = [4,5,6,7,2,3]
|
||
|
|
|
||
|
|
def findMin(nums):
|
||
|
|
|
||
|
|
# 1-elem array
|
||
|
|
if len(nums)==1:
|
||
|
|
return nums[0]
|
||
|
|
|
||
|
|
left = 0
|
||
|
|
right = len(nums)-1
|
||
|
|
|
||
|
|
# this condition means arr is already sorted, so just return first element
|
||
|
|
if nums[right] > nums[0]:
|
||
|
|
return nums[0]
|
||
|
|
|
||
|
|
|
||
|
|
while right>=left:
|
||
|
|
|
||
|
|
mid = left + (right-left) // 2
|
||
|
|
|
||
|
|
# min found: case 1
|
||
|
|
if nums[mid] > nums[mid+1]: # 3 4 5 1 2 where 5 is mid
|
||
|
|
return nums[mid+1]
|
||
|
|
|
||
|
|
# min found: case 2
|
||
|
|
if nums[mid-1] > nums[mid]: # 4 5 1 2 3 where 1 is mid
|
||
|
|
return nums[mid]
|
||
|
|
|
||
|
|
|
||
|
|
### min not found cases below
|
||
|
|
# mid is greater than first elem so ignore left half
|
||
|
|
if nums[mid] > nums[0]:
|
||
|
|
left = mid+1
|
||
|
|
|
||
|
|
# mid is less than first elem, ignore right half
|
||
|
|
else:
|
||
|
|
right = mid-1
|
||
|
|
|
||
|
|
|
||
|
|
print(findMin(arr))
|