Leetcode--H-Index

Leetcode--H-Index

欢迎关注H寻梦人公众号

image-20210120103201067

image-20210711182516582

题目解析:

思路:

1、首先看到h个元素大于等于某个值,N-h个元素小于等于某个值,这显然是一个有序序列的特征,所以自然而然的想到先将数组排序;

2、将数组排序之后,对于给定的某个i,我们知道有citations.length - i篇论文的引用数 ≥ citations[i],i篇
论文的引用数 ≤ citations[i];

3、不妨设h = citations.length - i,即至多有h篇论文分别引用了至少citation[i]次,其余citations.length - h篇
论文的引用数不多于citation[i]次。

既然如此,只要citation[i] ≥ h,就满足题意。

解答一

class Solution {
    public int hIndex(int[] citations) {
        Arrays.sort(citations);
        for (int i = 0; i < citations.length; i++) {
            int h = citations.length - i;
            if (h <= citations[i]) {
                return h;
            }
        }
        return 0;
    }
}

解答二

利用二分法快速求解,最终结果会在1-n之间,利用该条件二分,选择出h的最大值

class Solution {
    /**
     * 二分法
     * 由题目意思可得出:最终结果会在1-n之间,利用该条件二分,选择出h的最大值
     * @param citations
     * @return
     */
    public int hIndex(int[] citations) {
        int len = citations.length;
        int low = 0, high = len - 1;
        int result = 0;
        Arrays.sort(citations);
        while (low <= high) {
            int mid = (high - low) / 2 + low;
            if (check(len,mid,citations)) {
                // 我们的需求是要找出最大的H值,会在数组的个数值之间
                result = len - mid;
                high = mid - 1;
            } else {
                low = mid + 1;
            }
        }
        return result;
    }

    /**
     * 条件判断是否符合H指数的条件
     * @param len
     * @param mid
     * @param citations
     * @return
     */
    private boolean check(int len, int mid, int[] citations) {
        return (len - mid) <= citations[mid];
    }
}
posted @ 2021-07-11 18:36  扫地の小沙弥  阅读(67)  评论(0编辑  收藏  举报