个人思路:创建新数组统计每个引用次数的文献的数量,然后挨个判断每个数是不是h指数,会用到后缀和,方法原始,需要额外的数组空间
C
int back_sum(int score[],int index){
long sum=0;
for(int i=index;i<1001;i++){
sum += score[i];
}
return sum;
}
int hIndex(int* citations, int citationsSize) {
int score[1001]={0};
// memset(score,0,sizeof(int));
for(int i=0;i<citationsSize;i++){
score[citations[i]]++;
}
int res=0;
for(int i=0;i<1001;i++){
if(back_sum(score,i)>=i){
res = i;
}
}
return res;
}
python
class Solution:
def back_sum(self, score, index):
sum=0
for i in range(index, 1001):
sum += score[i]
return sum
def hIndex(self, citations: List[int]) -> int:
score = []
for i in range(0,1001):
score.append(0)
for i in range(0, len(citations)):
score[citations[i]] += 1
res=0
for i in range(0,1001):
if self.back_sum(score,i)>=i:
res=i
return res
java
class Solution {
public int backSum(int score[], int index){
int sum=0;
for(int i=index;i<1001;i++){
sum += score[i];
}
return sum;
}
public int hIndex(int[] citations) {
int[] score = new int[1001];
for(int i=0;i<citations.length;i++){
score[citations[i]]++;
}
int res=0;
for(int i=0;i<1001;i++){
if(backSum(score,i)>=i){
res = i;
}
}
return res;
}
}
思路升级,查找的最大h数不可能超过文献数量,且可以从后往前找,找到的第一个就是结果
C
int back_sum(int score[],int index){
long sum=0;
for(int i=index;i<1001;i++){
sum += score[i];
}
return sum;
}
int hIndex(int* citations, int citationsSize) {
int score[1001]={0};
// memset(score,0,sizeof(int));
for(int i=0;i<citationsSize;i++){
score[citations[i]]++;
}
for(int i=citationsSize;i>=0;i--){
if(back_sum(score,i)>=i){
return i;
}
}
return 0;
}
确实快了不少