题意:

image.png

解题思路:

  1. 思路:
  2. 1. 如果将有序数组在某个点进行旋转,必将分成2个有序数组,且后面数组元素都要小于前面元素;
  3. 2. 如果最后一个数跟第一个数相同,则删除最后一个数,缩小查询范围;
  4. 3. 采用二分法求出中间元素,如果中间值小于左边第一个元素,则说明最小元素在右边有序数中;
  5. 4. 我们只需要缩小右边数组,在[l, mid]中去查找最小元素,最小值一定在mid,或者mid左边;

PHP代码实现:

  1. class Solution {
  2. /**
  3. * @param Integer[] $nums
  4. * @return Integer
  5. */
  6. function findMin($nums) {
  7. $l = 0;
  8. $r = count($nums) - 1;
  9. //最后一个数跟第一个数相同,则删除最后一个数
  10. while ($l < $r && $nums[$r] == $nums[0]) $r--;
  11. if ($nums[$l] <= $nums[$r]) return $nums[0];//单调递增
  12. while ($l < $r) {
  13. $mid = $l + floor(($r - $l) >> 1);
  14. if ($nums[$mid] < $nums[0]) $r = $mid;
  15. else $l = $mid + 1;
  16. }
  17. return $nums[$l];
  18. }
  19. }

GO代码实现:

  1. func findMin(nums []int) int {
  2. l, r := 0, len(nums) - 1
  3. for nums[r] == nums[l] && l < r {
  4. r--
  5. }
  6. if nums[r] >= nums[l] {
  7. return nums[0]
  8. }
  9. for l < r {
  10. mid := l + (r - l) >> 1
  11. if nums[mid] < nums[0] {
  12. r = mid
  13. } else {
  14. l = mid + 1
  15. }
  16. }
  17. return nums[r]
  18. }