274. H指数

274. H指数

题目简介:

题目简介

题目示例:

题目示例 提示:如果h有多个可能的值,h指数就是其中最大的一个


解题思路:

有一点值得注意的是:h不一定存在于数组中,下面举个例子
数组:[4, 0, 6, 1, 5], 它得出来的h指数是:3,h在这里并不是数组的元素

有了这一点做铺垫,我们就大概感觉到,h这个数大概在数组元素中排中间位置,而且根据示例中的提示:h是最大的一个,就知道,应该将数组排序之后,从大到小遍历,找出h

那么,h又满足什么条件呢?

假设数组有N个数组,已经是升序,那么先让h=0,从后面大到小遍历,同时h++,直到部满足以下两个条件:
1、citations[I]>h / /为了至少有N-h个论文至少被引用次数不多于h次
2、I >=0 / / 不会数组越界

综上得出循环的C代码是:

while(i>=0&&citations[i]>h)
{
	h++;
	i++;
}

代码展示:

我用了两种排序,选择排序和快速排序,那么如果沦时间复杂度,肯定是快速排序更快

/*void swap(int *a,int *b)//选择排序的交换函数
{
    int temp=*a;
    *a=*b;
    *b=temp;
}*/
int compare(int *a,int *b)//快速排序的比较函数,a-b是升序
{
    return *a-*b;
}
int hIndex(int* citations, int citationsSize){
    /*选择排序
    int max;
    for(int i=0;i<citationsSize;i++)
    {
        max=i;
        for(int j=i+1;j<citationsSize;j++)
        {
            if(citations[j]<citations[max])
            {
                max=j;
            }
        }
        if(i!=max)
        {
            swap(&citations[i],&citations[max]);
        }
    }*/
    qsort(citations,citationsSize,sizeof(int),compare);//快速排序
    int index=citationsSize-1;/由于升序,因此从后面往前遍历
    int h=0;//h初始值为0
    while(index>=0&&citations[index]>h)//循环条件,详解见上
    {
        h++;
        index--;
    }
    return h;//返回h
}

性能分析:

时间分析:

选择排序:选择排序里面有嵌套循环,那么排序就要循环n*(n-a)次后加上常数次操作,然后算上while循环的O(n),因此是O(n*n)

快速排序:快速排序时间复杂度是O(nlogn),然后加上while的O(n),因此是O(nlogn)

从上面就可以看出快速排序快于选择排序。

空间分析

选择排序:由于没有开辟新的内存空间,因此是O(1)

快速排序:O(logn)

因此,选择排序比快速排序更加省空间
(空间分析可能出错,因为有些陌生)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值