剑指 Offer 11. 旋转数组的最小数字(简单)

通过率 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的左边还是右边

剑指 Offer 11. 旋转数组的最小数字(简单)

 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 };

 

上一篇:JS数组中 forEach() 和 map() 的区别


下一篇:增强的for循环