【LeetCode从零单刷】H-index I & II
2015-11-01 10:25
435 查看
题目:
Given an array of citations (each citation is a non-negative integer) of a researcher, write a function to compute the researcher's h-index.
According to the definition of h-index on Wikipedia: "A scientist has index h if h of
his/her N papers have at least h citations each, and the other N − h papers have no more thanh citations
each."
For example, given
in total and each of them had received
researcher has
each and the remaining two with no more than
each, his h-index is
Note: If there are several possible values for
the maximum one is taken as the h-index.
解答:
一开始做的非常麻烦,遍历引用数(并没连续分布,有间隔值),因此还要计算 maximum、维护与 size 的关系。
遍历应针对连续值(此题中的 size 值是连续分布的)。其实看维基可以清楚知道算法:h-index
(f) =
![](https://upload.wikimedia.org/math/0/d/9/0d9fc778239c95a0bb75bbc2aea67bcb.png)
class Solution {
public:
int hIndex(vector<int>& citations) {
int size = citations.size();
if (size == 0) return 0;
sort(citations.begin(), citations.end(), [](int a, int b){return a>b;});
vector<int> tmp;
for(int i = 0; i< size; i++)
{
tmp.push_back(citations[i]>(i+1)?(i+1):citations[i]);
}
sort(tmp.begin(), tmp.end(), [](int a, int b){return a>b;});
return tmp[0];
}
};
H-index II 题目有着进一步要求,变为如下:
Follow up for H-Index: What if the
is sorted in ascending order? Could you optimize your algorithm?
Hint:
Expected runtime complexity is in O(log n) and the input is sorted.
解答:
看到 O(log n)应该自动想到二分搜索。而且这里是已经排好序的 citations 数组。注意处理数组为0,以及数组最大值小于等于0的情况。
class Solution {
public:
int hIndex(vector<int>& citations) {
int size = citations.size();
if(size == 0 || citations[size - 1] <= 0) return 0;
int left = 0;
int right = size - 1;
int mid;
while(left < right)
{
mid = (left + right) / 2;
if (citations[mid] < size - mid)
left = mid + 1;
else
right = mid;
}
return (size - right);
}
};
Given an array of citations (each citation is a non-negative integer) of a researcher, write a function to compute the researcher's h-index.
According to the definition of h-index on Wikipedia: "A scientist has index h if h of
his/her N papers have at least h citations each, and the other N − h papers have no more thanh citations
each."
For example, given
citations = [3, 0, 6, 1, 5], which means the researcher has
5papers
in total and each of them had received
3, 0, 6, 1, 5citations respectively. Since the
researcher has
3papers with at least
3citations
each and the remaining two with no more than
3citations
each, his h-index is
3.
Note: If there are several possible values for
h,
the maximum one is taken as the h-index.
解答:
一开始做的非常麻烦,遍历引用数(并没连续分布,有间隔值),因此还要计算 maximum、维护与 size 的关系。
遍历应针对连续值(此题中的 size 值是连续分布的)。其实看维基可以清楚知道算法:h-index
(f) =
![](https://upload.wikimedia.org/math/0/d/9/0d9fc778239c95a0bb75bbc2aea67bcb.png)
class Solution {
public:
int hIndex(vector<int>& citations) {
int size = citations.size();
if (size == 0) return 0;
sort(citations.begin(), citations.end(), [](int a, int b){return a>b;});
vector<int> tmp;
for(int i = 0; i< size; i++)
{
tmp.push_back(citations[i]>(i+1)?(i+1):citations[i]);
}
sort(tmp.begin(), tmp.end(), [](int a, int b){return a>b;});
return tmp[0];
}
};
H-index II 题目有着进一步要求,变为如下:
Follow up for H-Index: What if the
citationsarray
is sorted in ascending order? Could you optimize your algorithm?
Hint:
Expected runtime complexity is in O(log n) and the input is sorted.
解答:
看到 O(log n)应该自动想到二分搜索。而且这里是已经排好序的 citations 数组。注意处理数组为0,以及数组最大值小于等于0的情况。
class Solution {
public:
int hIndex(vector<int>& citations) {
int size = citations.size();
if(size == 0 || citations[size - 1] <= 0) return 0;
int left = 0;
int right = size - 1;
int mid;
while(left < right)
{
mid = (left + right) / 2;
if (citations[mid] < size - mid)
left = mid + 1;
else
right = mid;
}
return (size - right);
}
};
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解
- 解析C++中派生的概念以及派生类成员的访问属性
- C++ Custom Control控件向父窗体发送对应的消息