题目
思路与算法
- 翻译一下题目意思:给的数组就是每一篇论文的引用次数,至少有h篇文章被引用了h次的意思等价于我们不恰当的假设这个科学家每次发表的文章的引用次数都在下降,出道即巅峰,然后一直衰落,那么第n篇的引用次数至少要比当前的序号大才可以匹配H指数的定义。
- 综上:思路为倒序排列(顺便再重温一下排序,使用Arrays类内嵌的方法TimSort方法的原型方法:归并排序方法来重新手写一遍),然后对比序号和实际数值的大小,找到那个引用次数小于序号的,然后减一,即是H指数。
代码实现
class Solution {
public int hIndex(int[] citations) {
Merge_Sort(citations);
int n = 1;
for (int i = 0;i < citations.length; i++,n++){
if ( citations[i] < n){
break;
}
}
return n-1;
}
private static void Merge_Sort(int[] arr) {
int[] temp = new int[arr.length];
Merge_Sort(arr, 0, arr.length - 1, temp);
}
private static void Merge_Sort(int[] arr, int left, int right, int[] tmp) {
if (left < right) {
int mid = (left + right) / 2;
Merge_Sort(arr, left, mid, tmp);
Merge_Sort(arr, mid + 1, right, tmp);
Merge(arr, left, mid, right, tmp);
}
}
private static void Merge(int[] arr, int left, int mid, int right, int[] tmp) {
int i = left;
int j = mid + 1;
int k = 0;
while (i <= mid && j <= right) {
if (arr[i] >= arr[j]) {
tmp[k++] = arr[i++];
} else {
tmp[k++] = arr[j++];
}
}
while (i <= mid) {
tmp[k++] = arr[i++];
}
while (j <= right) {
tmp[k++] = arr[j++];
}
k = 0;
while (left <= right) {
arr[left++] = tmp[k++];
}
}
}
复杂度分析
分类 | Value |
---|
时间复杂度 | O(MNlogN) |
空间复杂度 | O(M) |