题意:
解题思路:
思路:
1. 如果将有序数组在某个点进行旋转,必将分成2个有序数组,且后面数组元素都要小于前面元素;
2. 采用二分法,求出中间元素,如果中间值大于右边最大值,则说明最小元素在右边有序数组中;
3. 如果元素在右边数组中,则需要缩小范围,到右边数组中查找,则l = mid + 1,
4. 如果中间值小于等于右边最大值,则说明mid已经在右边数组中,但不是最小元素,还需要往左移,找到最小元素;
PHP代码实现:
class Solution {
/**
* @param Integer[] $nums
* @return Integer
*/
function findMin($nums) {
$l = 0;
$r = count($nums) - 1;
if ($nums[$r] >= $nums[$l]) return $nums[0];
while ($l < $r) {
$mid = $l + floor(($r - $l) >> 1);
if ($nums[$mid] > $nums[$r]) $l = $mid + 1;
else $r = $mid;
}
return $nums[$l];
}
}
GO代码实现:
func findMin(nums []int) int {
l, r := 0, len(nums) - 1
if nums[r] >= nums[l] {
return nums[0]
}
for l < r {
mid := l + (r-l) >> 1
if nums[mid] > nums[r] {
l = mid + 1
} else {
r = mid
}
}
return nums[l]
}