题目描述:
已知一个长度为 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 ,它原来是一个升序排列的数组,并按上述情形进行了多次旋转。请你找出并返回数组中的 最小元素 。
力扣链接:https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array
解题思路:
1.如果数组长度为1,返回唯一的一个数
2.定义两个指针,第一个low指向数组的开头 第二个high指向数组的结尾
3.检查数组是否被翻转,如果没有,则返回数组里的第一个数
4.当left小于right时,取中间作为mid进行二分搜索; 如果mid的左边一个数大于mid,或者mid的右边一个数小于mid, 则返回mid
5.否则,如果left所在的数小于mid, 则将left右移至mid+1位置(砍掉左半边)
6.否则,将right左移至mid-1的位置(砍掉右半边)
var findMin = function(nums) {
if(nums.length==1){
return nums[0]
}
//判断数组是否反转
if(nums[nums.length-1]>nums[0]){
return nums[0]
}
let low=0,high=nums.length-1;
while(low<high){
let mid = parseInt(low+(high-low)/2)
if(nums[mid]<nums[mid-1]){
return nums[mid]
}
if(nums[mid]>nums[mid+1]){
return nums[mid+1]
}
if(nums[mid]>nums[low]){
low = mid+1
}else{
high = mid-1
}
}
};