275H指數II

題目描述

給定一位研究者論文被引用次數的數組(被引用次數是非負整數),數組已經按照升序排列。編寫一個方法,計算出研究者的 h 指數。

h 指數的定義: “h 代表“高引用次數”(high citations),一名科研人員的 h 指數是指他(她)的 (N 篇論文中)至多有 h 篇論文分別被引用了至少 h 次。(其餘的 N - h 篇論文每篇被引用次數不多於 h 次。)"

示例:

輸入: citations = [0,1,3,5,6]

輸出: 3

解釋: 給定數組表示研究者總共有 5 篇論文,每篇論文相應的被引用了 0, 1, 3, 5, 6 次。
由於研究者有 3 篇論文每篇至少被引用了 3 次,其餘兩篇論文每篇被引用不多於 3 次,所以她的 h 指數是 3。

說明:

如果 h 有多有種可能的值 ,h 指數是其中最大的那個。

進階:

  • 這是 H指數 的延伸題目,本題中的 citations 數組是保證有序的。
  • 你可以優化你的算法到對數時間複雜度嗎?

思路分析

題幹裏重點標註了升序排列,加上進階裏面說的對數時間複雜度,所以用二分。

套用模板,這裏基礎模板或者左區間模板都可。

  1. h指數是至多有 h 篇論文分別被引用了至少 h 次,我們可以轉換爲 求數組中至少能找到 h 個 大於等於 h 的數字。
  2. 每次二分的判斷,是將 nums[mid] 和 nums.length - mid 比較(nums.length - mid 可以理解爲有 nums.length - mid 篇論文)。
  3. 若 nums[mid] 大,表示當前 h指數爲 nums.length - mid ,繼續去左邊判斷還有沒有更大的h值。
  4. 若小於,表示不符合,去右邊繼續找h值。

代碼實現

    public int hIndex(int[] citations) {
        int n = citations.length;
        if (citations == null || n == 0) {
            return 0;
        }
        int left = 0, right = n - 1;
		while (left < right) {
            int mid = left + (right - left) / 2;
            if (citations[mid] < n - mid) {
                left = mid + 1;
            } else {
                right = mid;
            }
        }
        return n - left;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章