题意:
解题思路:
思路: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]}