🌕 274. H 指数

吞佛童子2022年10月10日
  • algorithm
  • Array
大约 1 分钟

🌕 274. H 指数

难度: 🌕

问题描述

img_3.png


解法 1 - 排序

class Solution {
    public int hIndex(int[] citations) {
        // 思路:
        // 数组排序 - 找到某个下标处 [len - i] >= i
        Arrays.sort(citations);
        int len = citations.length;
        int i = len;
        for(; i > 0; i --) {
            if(citations[len - i] >= i) {
                return i;
            }
        }
        return 0;
    }
}

输出 1

img_2.png


解法 2 - 二分

class Solution {
    public int hIndex(int[] citations) {
        // 思路:
        // 二分 - h ∈ [0, len],从 len 开始往下查找
        int len = citations.length;
        return mySol(citations, 0, len);
    }

    private int mySol(int[] citations, int left, int right) {
        // 递归终止条件
        if(left >= right) {
            return left;
        }
        if(left == right - 1) {
            int tmp = 0;
            for(int i : citations) {
                if(i >= right) {
                    tmp ++;
                }
            }
            if(tmp >= right) {
                return right;
            } else {
                return left;
            }
        }
        int mid = left + ((right - left) >> 1);
        int count = 0;
        for(int i: citations) {
            if(i >= mid) {
                count ++;
            }
        }
        if(count >= mid) {
            return mySol(citations, mid, right);
        } else {
            return mySol(citations, left, mid - 1);
        }
    }
}

输出 2

img_4.png


解法 3

class Solution {
    public int hIndex(int[] citations) {
        // 思路:
        // h ∈ [0, len] 
        // 设置数组,记录 [0, len] 各次数下论文数量
        // 从后往前遍历非空下标,判断是否满足条件,若不满足条件,继续遍历
        int len = citations.length;
        int[] array = new int[len + 1];
        for(int i: citations) {
            if(i > len) {
                array[len] ++; // 超出 len 次数的论文按照 len 统计
            } else {
                array[i] ++;
            }
        }
        // 遍历 array
        int prev = 0; // 前面保存的论文数,这样就不用每次遇到一个可能的 h 值就进行数组的遍历统计有多少个比它大的数
        for(int j = len; j >= 0; j --) {
            prev += array[j];
            if(prev >= j) {
                return j;
            }
        }
        return 0;
    }
}

输出 3

img_5.png

上次编辑于: 2022/10/10 下午8:43:48
贡献者: liuxianzhishou