​LeetCode刷题实战274:H指数

算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !

今天和大家聊的问题叫做 H 指数,我们先来看题面:

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

Given an array of integers citations where citations[i] is the number of citations a researcher received for their ith paper, return compute the researcher's h-index.

According to the definition of h-index on Wikipedia: A scientist has an index h if h of their n papers have at least h citations each, and the other n − h papers have no more than h citations each.

If there are several possible values for h, the maximum one is taken as the h-index.

给定一位研究者论文被引用次数的数组(被引用次数是非负整数)。编写一个方法,计算出研究者的 h 指数。

h 指数的定义:h 代表“高引用次数”(high citations),一名科研人员的 h 指数是指他(她)的 (N 篇论文中)总共有 h 篇论文分别被引用了至少 h 次。且其余的 N - h 篇论文每篇被引用次数 不超过 h 次。

例如:某人的 h 指数是 20,这表示他已发表的论文中,每篇被引用了至少 20 次的论文总共有 20 篇。

示例

输入:citations = [3,0,6,1,5]
输出:3 
解释:给定数组表示研究者总共有 5 篇论文,每篇论文相应的被引用了 3, 0, 6, 1, 5 次。
  由于研究者有 3 篇论文每篇 至少 被引用了 3 次,其余两篇论文每篇被引用 不多于 3 次,所以她的 h 指数是 3。

解题

https://blog.csdn.net/qq_41855420/article/details/88207199

可能大家会被这道题看起来“高大上”的概念所吓倒,其实这道题一点都不难。

首先我们需要直到,H指数不会大于这些论文的总数,因为最多所有的论文都被引用无穷次,这些论文的H指数也是论文数量。

所以,我们定义一个数组dp[0,n]表示dp[i]表示被引用超过i次的论文数。然后从后往前扫描,判断dp[i] >= i的第一个就是结果。

class Solution {
public:
  int hIndex(vector<int>& citations) {
    int citationsSize = citations.size();
    vector<int> dp(citationsSize + 1, 0);//用于记录大于等于i的论文被引用的多少次
    for (auto num : citations) {
      if (num > citationsSize) {//这篇论文引用超过citationsSize也只能记作被引用了citationsSize次(因为H指数不会大于论文的总数)
        dp[citationsSize] += 1;
      }
      else {//在界限内直接自增
        dp[num] += 1;
      }
    }
        //因为需要找最大的H值,所以需要从后往前扫描
        //判断是否所有的论文引用次数都大于等于citationsSize次
    if (dp[citationsSize] >= citationsSize) {
      return citationsSize;
    }
        //然后从后往前开始扫描(动态规划)
    for (int i = citationsSize - 1; i >= 0; --i) {
      dp[i] += dp[i + 1];//引用次数大于等于i + 1次的肯定 大于i次,所以需要加上(比如示例中引用次数为6的计算为超过3次的)
      if (dp[i] >= i) {//判断是否达到H指数的标准
        return i;
      }
    }
    return 0;
  }
};

好了,今天的文章就到这里,如果觉得有所收获,请顺手点个在看或者转发吧,你们的支持是我最大的动力 。

上期推文:

LeetCode1-260题汇总,希望对你有点帮助!

LeetCode刷题实战261:以图判树

LeetCode刷题实战262:行程和用户

LeetCode刷题实战263:丑数

LeetCode刷题实战264:丑数 II

LeetCode刷题实战265:粉刷房子II

LeetCode刷题实战266:回文排列

LeetCode刷题实战267:回文排列II

LeetCode刷题实战268:丢失的数字

LeetCode刷题实战269:火星词典

LeetCode刷题实战270:最接近的二叉搜索树值

LeetCode刷题实战271:字符串的编码与解码

LeetCode刷题实战272:最接近的二叉搜索树值 II

LeetCode刷题实战273:整数转换英文表示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值