美文网首页计算机
Leetcode - H-Index

Leetcode - H-Index

作者: Richardo92 | 来源:发表于2016-09-22 11:21 被阅读33次

    My code:

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

    题目的意思没怎么搞懂。
    其实就是以某个value为分界线,判断 数组中 >= 该value的元素个数是否 = 该value

    所以,首先想到的是,给数组排序。
    然后对于 nums[i]

    = nums[i] 的个数 = nums.length - i
    所以 , value = nums.length - i,以这个value划分,将会有 nums.length - i 个元素 >= 他

    nums[i] >= value => nums[i] >= nums.length - i

    排序的解法就出来了。
    时间复杂度是 O(n log n)

    但如果牺牲空间,有办法把时间降到 O(n) 吗?
    于是想到了那几个不基于比较的排序算法。
    counting sort, radix sort, bucket sort, 他们的复杂度可以达到 O(n)
    但都要求,一定的已知的范围。

    这道题目,citations 个数并没有范围。所以怎么用?
    但是想到, 如果 citations >= n, 他们是多少,我们都无所谓了。
    可以用 bucket sort

    My code:

    public class Solution {
        public int hIndex(int[] citations) {
            if (citations == null || citations.length == 0) {
                return 0;
            }
            
            int n = citations.length;
            int[] bucket = new int[n + 1];
            for (int i = 0; i < citations.length; i++) {
                if (citations[i] >= n) {
                    bucket[n] += 1;
                }
                else {
                    bucket[citations[i]] += 1;
                }
            }
            
            int sum = 0;
            for (int i = n; i >= 0; i--) {
                sum += bucket[i];
                if (sum >= i) {
                    return i;
                }
            }
            
            return 0;
        }
    }
    

    reference:
    https://discuss.leetcode.com/topic/40765/java-bucket-sort-o-n-solution-with-detail-explanation/2

    还有两篇文章写的不错:
    https://discuss.leetcode.com/topic/29828/if-we-really-come-across-this-question-in-interview-sort-is-allowed-or-not/3

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

    Anyway, Good luck, Richardo! -- 09/21/2016

    相关文章

      网友评论

        本文标题:Leetcode - H-Index

        本文链接:https://www.haomeiwen.com/subject/esrzettx.html