典型二分查找
[1 2 3 4 5 6 7] mid < left 在[left,mid]
[4 5 6 7 1 2 3 ] mid > left 在[mid, right]
[5 6 7 1 2 3 4] mid < left 在[left,mid]
while(start+1 < end) 退出时候有两种情况:
一种是start+1 == end ,取nums[start],nums[end]最小值,这种情况数组的长度是偶数。
还有一种是start+1 > end,也就是start == end,这种情况数组的长度是奇数,去任意一个返回即可
if(start == end)
return nums[start];
if(nums[start] < nums[end])
return nums[start];
else
return nums[end];
精简下就是
if(nums[start] < nums[end])
return nums[start];
return nums[end];
int findMin(int* nums, int numsSize) {
int start = 0;
int end = numsSize - 1;
int mid;
while(start+1 < end){
mid = start + (end - start)/2;
if(nums[mid] < nums[end])
end = mid;
else
start = mid;
}
if(nums[start] < nums[end])
return nums[start];
return nums[end];
}