此题二分查找中间值应该和哪个值比较?

  • 此题旋转数组中的旋转点将数组分为两个有序部分,左有序部分的元素必然大于右有序部分的所有元素,且最小值在右有序部分。因此我们要将区间定位到右有序部分,并逐渐缩小区间找到最下值。
  • 由于右有序部分的最大值为右边界值,因此可以用中间值和右边界值比较,如果中间值大于右边界值,说明此时中间值在左有序部分,需要改变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
};