题意:
解题思路:
思路:
1. 如果将有序数组在某个点进行旋转,必将分成2个有序数组,且后面数组元素都要小于前面元素;
2. 如果最后一个数跟第一个数相同,则删除最后一个数,缩小查询范围;
3. 采用二分法求出中间元素,如果中间值小于左边第一个元素,则说明最小元素在右边有序数中;
4. 我们只需要缩小右边数组,在[l, mid]中去查找最小元素,最小值一定在mid,或者mid左边;
PHP代码实现:
class Solution {
/**
* @param Integer[] $nums
* @return Integer
*/
function findMin($nums) {
$l = 0;
$r = count($nums) - 1;
//最后一个数跟第一个数相同,则删除最后一个数
while ($l < $r && $nums[$r] == $nums[0]) $r--;
if ($nums[$l] <= $nums[$r]) return $nums[0];//单调递增
while ($l < $r) {
$mid = $l + floor(($r - $l) >> 1);
if ($nums[$mid] < $nums[0]) $r = $mid;
else $l = $mid + 1;
}
return $nums[$l];
}
}
GO代码实现:
func findMin(nums []int) int {
l, r := 0, len(nums) - 1
for nums[r] == nums[l] && l < r {
r--
}
if nums[r] >= nums[l] {
return nums[0]
}
for l < r {
mid := l + (r - l) >> 1
if nums[mid] < nums[0] {
r = mid
} else {
l = mid + 1
}
}
return nums[r]
}