1、Leetcode-面试经典150题目11-55. 跳跃游戏
思路:
1.题目中所说的H指数:至少发表了h篇论文,并且至少有h篇论文被引用次数大于h。h取所有h中最大值。
2.可喜可贺,做到第11题了,终于能ac一题了,虽然很暴力,但是还是有进步的。
3.我的思路就是先循环一遍,记录比当前i下标的论文被引用次数>=等于的数量,最后再比较一下,ans = max(ans,min(c[i],citations[i]))
class Solution {
public:
int hIndex(vector<int>& citations) {
int n = citations.size();
int c[n];//统计>=citations(i)的论文被引用次数
memset(c,0,sizeof(c));//初始化为0
int ans = 0;
for(int i = 0;i<n;i++){
for(int j =0;j<n;j++){
if(citations[j]>= citations[i])
c[i]++;
}
}
for(int i = 0;i<n;i++)
ans = max(ans,min(c[i],citations[i]));
return ans;
}
};
4.但是时间复杂度是O(n^2),可以继续进一步优化
5.可以想一想,这个h值的右边都是大于等于h,而左边的值都是小于等于h,所以可以使用二分,在找mid同时,扫描整个数组判断是否至少有mid个数大于mid,顺便背一下二分模板
class Solution {
public:
int hIndex(vector<int>& citations) {
int l = 0 , r = citations.size();
int mid = 0, cnt = 0;
while (l < r) {
mid = (l + r + 1) >> 1;
cnt = 0;
for (int i = 0; i < citations.size(); i++) {
if (citations[i] >= mid) {
cnt++;
}
}
if (cnt >= mid)
l = mid;
else
r = mid - 1;
}
return l;
}
};
知识点总结:数组、计数排序、排序
今天因为有其他任务,就只打卡一题,后续补上
每日一言:行动不一定带来幸福,但没有行动却一定不会有幸福。
2024年3月23日
softdream