[路飞]H指数

136 阅读1分钟

记录 1 道算法题

H 指数

leetcode-cn.com/problems/h-…


ps: 题目里有多个 k,理顺他们的关系。

要求:一个衡量指标就是 k,在一个数组中,至少有 k 个元素大于等于 k,其余 n - k 个数小于 k。

假设一个数组 [3,0,6,1,5],“有 k 个元素”,这里的 k 可以指代数组下标 i + 1,大于等于 k 就是元素的值要 arr[i] 要大于等于 k + 1,剩下 arr.length - k 个数需要小于 k。

首先我们需要进行排序,因为当数组是升序或者降序的时候,我们就可以直接判断某个下标的左边或者右边是大于某值或者小于某值。

接下来就是处理这个 k,这个 k 是未知的,并不是某一个下标的值,而 k 从 0 开始,是一定有满足要求的情况,所以需要遍历一遍数组,直到 k 无法继续增加。这时候 k 就是我们的结果。

    function hIndex(citations) {
        // 直接排序
        citations.sort((a, b) => a - b)
        
        let k = 0
        let i = citations.length
        
        // 由于判断无法增加是要小于 k 而升序排列导致前面的数一定小于 k,所以要从后往前遍历
        while(i >= 0 && citations[i] > k) {
            // 当前元素大于 k 的时候,一定满足 大于等于 k
            // 当元素小于等于 k 的时候,一定不满足 大于等于 k。
            // 所以增加就到此为止。
            k++
            i--
        }
        
        return k
    }