1. トピックの説明と要件
トピックの説明
整数配列の引用が与えられます。引用[i]は、研究者の i 番目の論文が引用された回数を表します。研究者の h インデックスを計算して返します。
Wikipedia の h インデックスの定義によると、h は「高い引用数」を表し、研究者の h インデックスは、その研究者が少なくとも h 件の論文を発表し、各論文が少なくとも h 回引用されていることを意味します。h に複数の値が考えられる場合、h インデックスは最大の値を持つものになります。
例
例 1:
输入:citations = [3,0,6,1,5]
输出:3
解释:给定数组表示研究者总共有 5 篇论文,每篇论文相应的被引用了 3, 0, 6, 1, 5 次。
由于研究者有 3 篇论文每篇 至少 被引用了 3 次,其余两篇论文每篇被引用 不多于 3 次,所以她的 h 指数是 3。
例 2:
输入:citations = [1,3,1]
输出:1
ヒント
n == citations.length
1 <= n <= 5000
0 <= citations[i] <= 1000
2. 問題解決のアイデア
一般的なアイデア:
まずトピックを分析します。トピックからは整数配列が得られ、配列内の要素は対応する論文が引用された回数を表します。そして、私たちがしなければならないことは、著者が少なくとも h 件の論文を発表していることを数えることだけであり、これらの h 件の論文は少なくとも h 回引用されるという条件を満たす必要があります。したがって、私たちがしなければならないことは、この h を見つけることだけであり、この h は最大である必要があります。
トピックを分析した後、問題の解決を開始します。まず、各論文には対応する引用数があり、タイトルで指定された配列は順序付けされていないため、共通点 (少なくとも h 回引用) を持つ論文の数を見つける必要があります。最初に配列全体をソートできます。 ,どの書類であるかを知る必要がないため、直接並べ替えることができます。(どの論文であるかを知る必要がある場合は、他の方法を使用して、対応する論文のシリアル番号を記録する必要があります。) 並べ替えると、特定の例で h がどのくらいであるかが一目でわかります。たとえば、配列 = 3,0,6,1,5; ソートされた結果が 0,1,3,5,6 である場合、少なくとも 3 つの論文が少なくとも 3 回引用されていることが直接わかります。しかし、この結果を得るにはコンピュータを取得する必要があります。
ソートした後、前の論文が少なくとも h 回引用できれば、その後ろの論文も少なくとも h 回引用できなければなりません。配列. トピック条件に関する論文。要約すると、参照の数 > h、h++、および i-- の場合、配列をlarge から small にトラバースし、h を 0 に初期化できます。参照カウント ≥ h を持つ最後の要素が見つかったときに、トラバーサルは終了します。なぜなら、この時点では前回の論文がh回以上引用されるという条件を満たしていないといけないからです。なぜ参照回数 > h なのかというと、 > h ということは少なくとも h+1 回参照されているということなので、少なくとも h 回参照されているという条件を満たすことができるからです。
具体的な手順:
①qsortソート関数のソート原理cmp関数をインクリメンタルソートとして定義する
②与えられた配列をソートする
③hとiを初期化する
④ ソートされた配列を逆順に走査し、条件に従って h を更新し、i を前方に移動します。
⑤hを返す
3. 具体的なコード【C言語】
時間計算量 O(nlogn) 空間計算量 O(logn) [主にソートに費やされる]
int cmp(int *a, int *b) {
return *a - *b;//顺序为递增
}
int hIndex(int* citations, int citationsSize){
//qsort函数包含四个参数,分别是:1.数组名 2.元素个数(从前往后计算)
//3.数组元素所占字节(int,double,char等所占字节) 4.排序原则(递增,递减,奇偶交叉等)
qsort(citations, citationsSize, sizeof(int), cmp);//将数组按照递增的顺序排序
int h = 0, i = citationsSize - 1;//初始化h为0
//从大到小遍历数组,当元素大于h时说明,当前论文至少被引用了h+1次因而将h++
//因为我们是从大到小对数组进行遍历,因而当前面的论文满足引用次数时,后一篇论文也能满足至少被引用的次数
//所以当我们找到小于等于h的元素时循环结束
while (i >= 0 && citations[i] > h) {
h++;
i--;
}
return h;
}