原题链接:https://www.acwing.com/problem/content/20/
class Solution {
public:
/*
我们发现除了最后水平的一段(黑色水平那段)之外,
其余部分满足二分性质:竖直虚线左边的数满足 nums[i]≥nums[0]
;而竖直虚线右边的数不满足这个条件。
分界点就是整个数组的最小值。
*/
int findMin(vector<int>& nums) {
if(nums.size() == 0) return -1;
int n = nums.size() - 1;
//
while(n - 1 >= 0 && nums[n] == nums[0]) n --;
// 有可能没旋转。
if (nums[n] >= nums[0]) return nums[0];
// 找到小于nums[0]的最小的。
int l = 0, r = n;
while(l < r)
{
int mid = l + r >> 1;
if(nums[mid] < nums[0]) r = mid;
else l = mid + 1;
}
return nums[l];
}
};
Python
class Solution(object):
def findMin(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
length = len(nums) - 1
if length == -1:
return -1;
while(length and nums[length] == nums[0]):
length = length - 1
if(nums[length] > nums[0]):
return nums[0]
l, r = 0, length
while l < r:
mid = (l + r) // 2
if nums[mid] < nums[0] :
r = mid
else:
l = mid + 1
return nums[l]