此题二分查找中间值应该和哪个值比较?
- 此题旋转数组中的旋转点将数组分为两个有序部分,左有序部分的元素必然大于右有序部分的所有元素,且最小值在右有序部分。因此我们要将区间定位到右有序部分,并逐渐缩小区间找到最下值。
- 由于右有序部分的最大值为右边界值,因此可以用中间值和右边界值比较,如果中间值大于右边界值,说明此时中间值在左有序部分,需要改变left指向middle+1将其逐渐向右有序部分靠近。如果中间值小于右边界值,说明此时中间值在右有序部分,要让right变为middle缩小右有序部分的区间来寻找最小值。如果中间值等于右边界值,只能一点点缩小右边界来寻找最下值。
参考
https://blog.nowcoder.net/n/770b93c590f149af876b34dcf252c009?f=comment
https://blog.nowcoder.net/n/438b4913b64948ad931f7f2a422770c5?f=comment
function minNumberInRotateArray(rotateArray)
{
// write code here
let left = 0;
let right = rotateArray.length-1;
let middle;
while (left < right) {
middle = Math.floor((right+left)/2);
if (rotateArray[middle] > rotateArray[right]) { // 中间值大于右边界值,说明中间值在左排序数组中,最小的数字在右边,因为左边部分一定大于右边部分
left = middle + 1;
}
else if (rotateArray[middle] === rotateArray[right]) { // 两者相等,无法确定最小值,要缩小右界
right--;
}
else { // 中间值小于右边界值,说明中间值在右排序数组中,此时缩小右界范围
right = middle;
}
}
return rotateArray[left];
}
module.exports = {
minNumberInRotateArray : minNumberInRotateArray
};



京公网安备 11010502036488号