67.寻找旋转排序数组中的最小值
153. 寻找旋转排序数组中的最小值
已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums = [0,1,2,4,5,6,7] 在变化后可能得到:
  • 若旋转 4 次,则可以得到 [4,5,6,7,0,1,2]
  • 若旋转 7 次,则可以得到 [0,1,2,4,5,6,7]

注意,数组 [a[0], a[1], a[2], ..., a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], ..., a[n-2]] 。

给你一个元素值 互不相同 的数组 nums ,它原来是一个升序排列的数组,并按上述情形进行了多次旋转。请你找出并返回数组中的 最小元素 。

你必须设计一个时间复杂度为 O(log n) 的算法解决此问题。

示例 1:

输入:nums = [3,4,5,1,2]
输出:1
解释:原数组为 [1,2,3,4,5] ,旋转 3 次得到输入数组。

【思路】

两种情况 中间>右边 [3,4,5,1,2]  最小在右边 left = mid+1;

中间<右边   [4,0,1,2,3] 最小在左边 right=mid;  不-1 因为说不定中间就是最小值

终止条件: 不相等,因为 若 left = mid+1 后 right=left都指向最小值,若结束条件为 left<=right ,循环卡在right=mid跳不出

class Solution {public int findMin(int[] nums) {int left = 0;int n = nums.length;int right = n-1;while(left<right){int mid = (right - left)/2+left;if(nums[mid] > nums[n-1]) left = mid+1;   // [3,4,5,1,2]  else right = mid;   //[4,0,1,2,3]
        }return nums[left];}
}