题意:

image.png

解题思路:

  1. 思路:
  2. 1. 如果将有序数组在某个点进行旋转,必将分成2个有序数组,且后面数组元素都要小于前面元素;
  3. 2. 采用二分法,求出中间元素,如果中间值大于右边最大值,则说明最小元素在右边有序数组中;
  4. 3. 如果元素在右边数组中,则需要缩小范围,到右边数组中查找,则l = mid + 1
  5. 4. 如果中间值小于等于右边最大值,则说明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. if ($nums[$r] >= $nums[$l]) return $nums[0];
  10. while ($l < $r) {
  11. $mid = $l + floor(($r - $l) >> 1);
  12. if ($nums[$mid] > $nums[$r]) $l = $mid + 1;
  13. else $r = $mid;
  14. }
  15. return $nums[$l];
  16. }
  17. }

GO代码实现:

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