題目
給你一個整數數組 citations ,其中 citations[i] 表示研究者的第 i 篇論文被引用的次數。計算并返回該研究者的 h 指數。
根據維基百科上 h 指數的定義: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
解決思路
計數排序,定義一個數組,用于存放各引用次數出現的次數,如果大于數組長度,那么就按數組長度算。然后從后往前遍歷計數數組,找出出現次數大于等于引用次數的,返回出現次數。
時間復雜度O(n),空間復雜度O(n)
代碼
class Solution {public int hIndex(int[] citations) {// 解決思路:計數排序,定義一個數組,用于存放各引用次數出現的次數,如果大于數組長度,那么就按數組長度算。然后從后往前遍歷計數數組,找出出現次數大于等于引用次數的,返回出現次數。int n = citations.length;// 1. 定義數組,用于記錄各元素出現次數。出現次數是0到數組長度int[] cnt = new int[n + 1];for (int i = 0; i < n; i++) {// 2. 如果出現次數大于等于數組長度,最后一個位置加1,否則對應位置加1.if (citations[i] >= n) {cnt[n]++;} else {cnt[citations[i]]++;}}// 2. 定義total記錄出現次數int total = 0;// 3. 遍歷數組,統計數組中每個引用次數的出現次數for (int i = n; i >= 0; i--) {total += cnt[i];// 4. 如果出現次數大于等于引用次數就返回。if (total >= i) {return i;}}return 0;}
}