题目描述
知识点
- 二分法
- Math.floor() 返回小于或等于一个给定数字的最大整数。
解题思路
根据题意这个数组是经过旋转的,所以存在前半部分大,后半部分小的情况,我们要做的就是把前后两部分的接壤点给找出来
- 初始值:
left=0, right=numbers.length-1;
- 以
left <= right
为条件进行循环,每次循环取`mid=Math.floor(left + right),会有三种情况:
情况1:numbers[mid] > numbers[right],说明numbers[mid]不是最小的,最小的值出现在numbers[mid]后面,所以我们让left = mid + 1继续循环;
情况2:numbers[mid] = numbers[right],说明最小的值出现在numbers[right]前面,我们让right = right - 1继续循环;
情况3:numbers[mid] < numbers[right],说明最小的值出现在numbers[mid]或者numbers[mid]前面,我们让right=mid继续循环; - 终止条件:
left = right
- 输入:
numbers[left]
或者numbers[right]
代码实现
/**
* @param {number[]} numbers
* @return {number}
*/
var minArray = function(numbers) {
let left = 0;
let right = numbers.length - 1;
while (left < right) {
let mid = Math.floor((left + right) /2);
if (numbers[mid] > numbers[right]) {
left = mid + 1;
} else if (numbers[mid] < numbers[right]) {
right = mid;
} else {
right -= 1;
}
}
return numbers[left]
};