【Leetcode】274. H-Index

题目地址:

https://leetcode.com/problems/h-index/

题意是,给定一个非负数组,找出满足这样性质的数 h h h:有多于等于 h h h个数是大于等于 h h h的。返回满足这样条件的最大的那个 h h h

法1:排序 + 二分。参考https://blog.csdn.net/qq_46105170/article/details/104022196。代码如下:

import java.util.Arrays;

public class Solution {
    public int hIndex(int[] citations) {
    	// 逆序排序
        Arrays.sort(citations);
        reverse(citations);

        int l = 0, r = citations.length;
        while (l < r) {
            int m = l + (r - l + 1 >> 1);
            if (citations[m - 1] >= m) {
                l = m;
            } else {
                r = m - 1;
            }
        }
        
        return l;
    }
    
    private void reverse(int[] nums) {
        int l = 0, r = nums.length - 1;
        while (l < r) {
            int tmp = nums[l];
            nums[l] = nums[r];
            nums[r] = tmp;
            l++;
            r--;
        }
    }
}

时间复杂度 O ( n log ⁡ n ) O(n\log n) O(nlogn),空间 O ( 1 ) O(1) O(1)

法2:计数。思路是,先将citation是 k k k的论文个数算出来(如果 k ≥ n k\ge n kn则按照 n n n计),设计数数组是 c c c,则 c [ i ] c[i] c[i]表示引用为 i i i的论文数量。接着逆序遍历 c c c并算后缀和 s i s_i si s i s_i si是逆序遍历到 c i c_i ci时的后缀和,也就是 c i + c i + 1 + . . . c_i+c_{i+1}+... ci+ci+1+...),如果第一次发现 s i ≥ i s_i\ge i sii了,说明有不少于 i i i篇文章的引用是大于等于 i i i的,所以答案就是 i i i。代码如下:

public class Solution {
    public int hIndex(int[] citations) {
        int len = citations.length;
        // 做计数
        int[] count = new int[len + 1];
        for (int citation : citations) {
            count[Math.min(len, citation)]++;
        }
        
        int sum = 0;
        for (int i = len; i >= 0; i--) {
            sum += count[i];
            if (i <= sum) {
                return i;
            }
        }
        
        return 0;
    }
}

时空复杂度 O ( n ) O(n) O(n)

©️2020 CSDN 皮肤主题: 创作都市 设计师:CSDN官方博客 返回首页