• 274. H-Index


        /*
         * 274. H-Index
         * 1.2 by Mingyang
         * 先将数组排序,我们就可以知道对于某个引用数,有多少文献的引用数大于这个数。对于引用数citations[i],
         * 大于该引用数文献的数量是citations.length - i,
         * 而当前的H-Index则是Math.min(citations[i], citations.length - i),
         * 我们将这个当前的H指数和全局最大的H指数来比较,得到最大H指数。
         */
           public int hIndex(int[] citations) {
                // 排序
                Arrays.sort(citations);
                int h = 0;
                for(int i = 0; i < citations.length; i++){
                    // 得到当前的H指数
                    int currH = Math.min(citations[i], citations.length - i);
                    if(currH > h){
                        h = currH;
                    }
                }
                return h;
            }
          /*
           *也可以不对数组排序,我们额外使用一个大小为N+1的数组stats。
           *stats[i]表示有多少文章被引用了i次,
           *这里如果一篇文章引用大于N次,我们就将其当为N次,
           *因为H指数不会超过文章的总数。为了构建这个数组,
           *我们需要先将整个文献引用数组遍历一遍,对相应的格子加一。
           *统计完后,我们从N向1开始遍历这个统计数组。
           *如果遍历到某一个引用次数时,大于或等于该引用次数的文章数量,
           *大于引用次数本身时,我们可以认为这是H指数。之所以不用再向下找,
           *因为我们要取最大的H指数。那如何求大于或等于某个引用次数的文章数量呢?
           *我们可以用一个变量,从高引用次的文章数累加下来。因为我们知道,如果有x篇文章的引用大于等于3次,
           *那引用大于等于2次的文章数量一定是x加上引用次数等于2次的文章数量。 
           */
           public int hIndex2(int[] citations) {
                int[] stats = new int[citations.length + 1];
                int n = citations.length;
                // 统计各个引用次数对应多少篇文章
                for(int i = 0; i < n; i++){
                    stats[citations[i] <= n ? citations[i] : n] += 1;
                }
                int sum = 0;
                // 找出最大的H指数
                for(int i = n; i > 0; i--){
                    // 引用大于等于i次的文章数量,等于引用大于等于i+1次的文章数量,加上引用等于i次的文章数量 
                    sum += stats[i];
                    // 如果引用大于等于i次的文章数量,大于引用次数i,说明是H指数
                    if(sum >= i){
                        return i;
                    }
                }
                return 0;
            }
  • 相关阅读:
    没人比程序猿更讨厌软件
    随心所欲~我也做个集合遍历器吧(自己的foreach,委托的威力)
    EF架构~DefaultValue让我的UnitOfWork更可读
    EF架构~数据分批批量提交
    陷阱~EF中的Update与Insert共用一个数据上下文
    我心中的核心组件(可插拔的AOP)~第四回 异常拦截器
    zigbee学习:示例程序SampleApp中通讯流程
    【网络可靠版】Extjs4 Treegrid 使用实例
    C#实现微信公众号群发消息(解决一天只能发一次的限制)
    oracle12c(oracle12.1.0.1.0)安装指南--实测OEL5.9(RH5)
  • 原文地址:https://www.cnblogs.com/zmyvszk/p/5619051.html
Copyright © 2020-2023  润新知