H-Index && H-Index II

Given an array of citations (each citation is a non-negative integer) of a researcher, write a function to compute the researcher‘s h-index.

According to the definition of h-index on Wikipedia: "A scientist has index h if h of his/her N papers have at least h citations each, and the other N ? h papers have no more than h citations each."

For example, given citations = [3, 0, 6, 1, 5], which means the researcher has 5 papers in total and each of them had received 3, 0, 6, 1, 5 citations respectively. Since the researcher has 3 papers with at least 3 citations each and the remaining two with no more than 3 citations each, his h-index is 3.

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

至少有h篇被人引用h次

  • 如果总共的论文数为N则,h最多为N
  • 计数排序
int hIndex(int* citations, int citationsSize) {
    int *array = (int *)malloc((citationsSize + 1) * sizeof(int));
    for (int i = 0; i < citationsSize + 1; i++)
        array[i] = 0;        //必须初始化
    for (int i = 0; i < citationsSize; i++)
    {
        if (citations[i] >= citationsSize)    //如果大于最大文章数,则认为最大引用文章值++
            array[citationsSize]++;
        else
            array[citations[i]]++;
    }
    if (array[citationsSize] >= citationsSize)
        return citationsSize;
    for (int i = citationsSize - 1; i >= 0; i--)
    {
        array[i] = array[i] + array[i + 1];
        if (array[i] >= i)
            return i;
    }
    return 0;
}

Follow up for H-Index: What if the citations array is sorted in ascending order? Could you optimize your algorithm?

int hIndex(int* citations, int citationsSize) {
    int n = 0;
    if(citations[0] >= citationsSize)
        return citationsSize;
    else
    {
        for(int i = citationsSize - 1; i >= 0; i--)
        {
            if(citations[i] >= citationsSize - i)    //如果被引用的次数大于同样次数以上的篇数时
                n++;
            else
                break;
        }
    }
    return n;
}
  • 二分查找
int hIndex(int* citations, int citationsSize) {
    int n = citationsSize;
    int low = 0, high = citationsSize - 1;
     while(low <= high)
     {
        int mid  = low + (high-low) / 2;
        if(citations[mid] == n - mid)
            return n-mid;
        else if(citations[mid] < n - mid)
            low = mid + 1;
        else
            high = mid - 1;
    }
    return n-low;
}
  • n – mid:代表引用次数大于citations[mid]的篇数
    • 如果citations[mid] 小于 篇数,则说明至少被引用citations[mid]次的文章数目大于该最小引用的次数
时间: 2024-10-20 20:33:29

H-Index && H-Index II的相关文章

H. 硬币水题II

H. 硬币水题II Time Limit: 1000ms Case Time Limit: 1000ms Memory Limit: 65536KB 64-bit integer IO format: %lld      Java class name: Main Submit Status PID: 29064 Font Size:  +   - 小胖有一个正反面不对称的硬币.如果抛一次这个硬币,它的正面朝上的概率为p,反面朝上的概率为1-p.现在,小胖想用这个硬币来产生等概率的决策(50%对

oc 与 swift 之间的桥接文件 (ProjectNmae-Bridging-Header.h) (ProjectNmae-Swift.h)

oc 与 Swift 是2用不同的语言, oc代码只能写带oc文件里, Swift代码只能写在Swift文件里, 虽然2者不同语言, 但却能互相调用, 不过需要进行一下桥接, 就是下面的2个文件 (ProjectNmae-Bridging-Header.h) Swift文件要调用oc代码的时候 你会发现你无法引用oc.h文件, 所以就要用到这个文件, 对oc文件进行桥接, 把一些oc.h文件在这里引用进去, 然后你就可以在Swift文件里操作oc代码 (ProjectNmae-Swift.h)

转:Sql Server中的表访问方式Table Scan, Index Scan, Index Seek

0.参考文献 Table Scan, Index Scan, Index Seek SQL SERVER – Index Seek vs. Index Scan – Diffefence and Usage – A Simple Note oracle表访问方式 Index Seek和Index Scan的区别以及适用情况 1.oracle中的表访问方式 在oracle中有表访问方式的说法,访问表中的数据主要通过三种方式进行访问: 全表扫描(full table scan),直接访问数据页,查找

sed命令n,N,d,D,p,P,h,H,g,G,x解析2

摘自: https://blog.csdn.net/xiexingshishu/article/details/50514132 sed命令n,N,d,D,p,P,h,H,g,G,x解析 2016年01月13日 23:55:32 kgduu 阅读数:4342更多 个人分类: shell 1. sed执行模板=sed '模式{命令1;命令2}' 即逐行读入模式空间,执行命令,最后输出打印出来 2. 为方便下面,先说下p和P,p打印当前模式空间内容,追加到默认输出之后,P打印当前模式空间开端至\n的

Sed命令n,N,d,D,p,P,h,H,g,G,x解析3

摘自:https://blog.csdn.net/WMSOK/article/details/78463199 Sed命令n,N,d,D,p,P,h,H,g,G,x解析 2017年11月06日 23:21:44 DataCareer 阅读数:503 标签: sedlinuxshell 更多 个人分类: Shell 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/WMSOK/article/details/78463199 前言 sed执行模板=s

MySQL 执行计划中Extra(Using where,Using index,Using index condition,Using index,Using where)的浅析

  关于如何理解MySQL执行计划中Extra列的Using where.Using Index.Using index condition,Using index,Using where这四者的区别.首先,我们来看看官方文档关于三者的简单介绍(官方文档并没有介绍Using index,Using where这种情况): Using index (JSON property: using_index) The column information is retrieved from the ta

ORB-SLAM2学习3 MapPoint.h Map.h KeyFrame.h

1.MapPoint.h 里面有个类MapPoint,其有两个构造函数.分别为,参考帧是关键帧和参入是普通帧的情况. 1 MapPoint(const cv::Mat &Pos, KeyFrame* pRefKF, Map* pMap); MapPoint(const cv::Mat &Pos, Map* pMap, Frame* pFrame, const int &idxF); [email protected] Pos,指的是该点的3D位置. 2 @pRefKF,参考关键帧.

pod JONSKit.h MBProgress.h 找不到头文件,怎么办?

这时你看项目pod部分,多了JSONKit库.好了,第三方库就这么神奇的加进来. 头文件路径 那试试看使用JONSKit.h,在ViewController.m里引用下.找不到头文件,怎么办?还没设置头文件的目录,在项目的Target的里设置一下: 如下图所示,输入${SRCROOT}  后面选上recursive.

sed命令n,N,d,D,p,P,h,H,g,G,x解析

1. sed执行模板=sed '模式{命令1;命令2}' 即逐行读入模式空间,执行命令,最后输出打印出来 2. 为方便下面,先说下p和P,p打印当前模式空间内容,追加到默认输出之后,P打印当前模式空间开端至\n的内容,并追加到默认输出之前. sed并不对每行末尾\n进行处理,但是对N命令追加的行间\n进行处理,因为此时sed将两行看做一行. 2-1.n命令 n命令简单来说就是提前读取下一行,覆盖模型空间前一行(并没有删除,因此依然打印至标准输出),如果命令未执行成功(并非跳过:前端条件不匹配),

hpp.h与.h的区别

hpp,其实质就是将.cpp的实现代码混入.h头文件当中,定义与实现都包含在同一文件,则该类的调用者只需要include该hpp文件即可,无需再将cpp加入到project中进行编译.而实现代码将直接编译到调用者的obj文件中,不再生成单独的obj,采用hpp将大幅度减少调用 project中的cpp文件数与编译次数,也不用再发布烦人的lib与dll,因此非常适合用来编写公用的开源库. hpp的优点不少,但是编写中有以下几点要注意: 1.是Header   Plus   Plus 的简写. 2.