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)
因此,选择排序比快速排序更加省空间
(空间分析可能出错,因为有些陌生)