算法学习之找到第一个大于的值

186 阅读1分钟

题目描述:给出一个升序数组 arr 和一个指定值 val,找到数组中第一个大于或等于 val 的值的索引(索引从1开始),若是不存在则返回 -1

如:arr = [3, 5, 7] val = 4,则输入为 2

二分搜索

function getIndex(val, arr) {
    const length = arr.length;
    if(arr[length -1] < val) return -1
    let left = 0;
    let right = length - 1;
    let middle;
    while(right > left){
        middle = left + Math.floor((right - left) / 2);
        if (arr[middle] < val) {
            left = middle + 1;
        } else {
            right = middle
        }
    }
    
    return right + 1
}

测试用例

function createAscendingArr (length = 10) {
    let val = 0;
    return new Array(length).fill(0).map(() => {
        val += Math.floor(Math.random() * Math.random() * 20)
        return val
    })
}

function createRandomNumber(){
    return Math.floor(Math.random() * Math.random() * 100)
}


function checkGetIndex(length, val, arr) {
    for(let i = 0; i < length; i++) {
        if (arr[i] >= val) {
            return i + 1
        }
    }

    return length + 1
}

function test(){

    for(let i = 0; i < 10; i++) {
        const arr = createAscendingArr(Math.floor(Math.random() * 20 + 10))
        const val = createRandomNumber()
        const index1 = getIndex(arr.length, val, arr)
        const index2 = checkGetIndex(arr.length, val, arr)
        if (index1 !== index2) {
            console.log(arr, val)
        } else {
            console.log(true)
        }
    }

}


test()