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