通过率 49.4%
题目描述:
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。
示例 1:
输入:[3,4,5,1,2]
输出:1
示例 2:
输入:[2,2,2,0,1]
输出:0
思路:
用二分,利用最小值左边的数大于等于其右边的数,且两边都是(非严格)递增的特性
难点:二分边界的确定
设区间为[l, r],则判断条件必须以r对应的值为准,在下面这两种情况,mid对应的值都大于l对应的值,单凭这点无法判断最小值是在mid的左边还是右边
1 /*JavaScript*/ 2 /** 3 * @param {number[]} numbers 4 * @return {number} 5 */ 6 var minArray = function(numbers) { 7 let [l, r] = [0, numbers.length-1] 8 while(l < r) { 9 const mid = l+r >> 1 10 if(numbers[mid] > numbers[r]) { 11 l = mid+1 12 }else if(numbers[mid] < numbers[0]) { 13 r = mid 14 }else { 15 r-- 16 } 17 } 18 return numbers[l]; 19 };