题目来源: https://leetcode-cn.com/problems/h-index/
大致题意:
给定一个数组,找出最大的h,h代表数组中有h个至少为h的元素。
思路
排序+遍历
先对数组排序,然后从后往前遍历。对于每次遍历的元素有:
- 求出当前元素到最大元素间共有num个元素
- 判断当前元素值是否大于等于num
- 若大于,则h更新为num;若小于,则不会有比当前h更大的h,退出循环
这样的时间复杂度为O(nlogn),空间复杂度为O(logn),即排序所需的空间
代码:
public int hIndex(int[] citations) {
int h = 0;
int curH;
Arrays.sort(citations);
for (int i = citations.length-1; i >= 0; i--) {
int num = citations.length - i; // num个,至少为citations[i]的数
if (citations[i] >= num) {
h = num;
}
else
break;
}
return h;
}
计数加遍历
根据定义可知,h指数不能大于数组长度n。
那么可使用一个大小为 n+1 的数组count存数组中每个元素的出现个数。其中:
- count[n] 为大于等于n的数在数组中出现的次数
- count[i] 为数组中大小为 i 的元素出现次数
遍历结束后,初始化一个遍历sum,再逆序遍历count数组。每次遍历时判断当前元素是否大于等于sum,若为真则 sum += count[i]。否则,则跳出循环。