↓快轉到主要內容
  1. LeetCode/

LeetCode 275: H-Index II

·1 分鐘· ·
LeetCode Medium Array Binary-Search
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: medium 第一次嘗試:2022-11-27

  • 提交紀錄:Wrong Answer ×2 → Accepted ×2

解題思路
#

h-index 是最大的 h,使得有 h 篇論文引用數 >= h。陣列由小到大排序,從位置 i 到結尾有 n - i 篇,條件是 citations[i] >= n - i(Binary Search 模板一)。這個條件從左到右是「先不成立、後成立」,找第一個成立的位置 i,答案就是 n - i;都不成立時 i = n,答案是 0。

我的嘗試
#

前兩版是線性掃描,但條件寫成 citations[i] >= 總篇數、找不到時沒有回傳值,例如 [0] 回傳 None,答案是 0。

正確解法
#

class Solution:
    def hIndex(self, citations: List[int]) -> int:
        n = len(citations)
        l, r = 0, n
        while l < r:
            mid = (l + r) // 2
            if citations[mid] >= n - mid:
                r = mid
            else:
                l = mid + 1
        return n - l

複雜度
#

時間 O(log n),空間 O(1)。

要特別避免的錯誤
#

  • 全部的引用數都是 0 時答案是 0,函式每條路徑都要有回傳值。

面試口說整理
#

引用數排好序之後,從某個位置開始引用數都夠多,所以我二分找第一個 citations[i] >= n - i 的位置,答案是 n - i。時間 O(log n)。

相關文章

LeetCode 540: Single Element in a Sorted Array
·1 分鐘
LeetCode Medium Array Binary-Search
LeetCode 540 解題筆記:單獨的那個出現之前,每一對都從偶數 index 開始;二分看偶數位置 mid 和 mid + 1 是否相同
LeetCode 611: Valid Triangle Number
·1 分鐘
LeetCode Medium Array Two-Pointers Binary-Search Greedy
LeetCode 611 解題筆記:排序後固定最長邊 k,左右指針找兩短邊:和夠大時中間的都可以,一次加 j - i 個
LeetCode 240: Search a 2D Matrix II
·1 分鐘
LeetCode Medium Array Binary-Search Divide-and-Conquer Matrix
LeetCode 240 解題筆記:從右上角開始,比目標大就往左、比目標小就往下,每一步排除一整列或一整欄
LeetCode 162: Find Peak Element
·1 分鐘
LeetCode Medium Array Binary-Search
LeetCode 162 解題筆記:nums[mid] < nums[mid + 1] 代表右邊一定有山峰(一路上升最後也會碰到邊界),否則左邊(含 mid)一定有
LeetCode 287: Find the Duplicate Number
·1 分鐘
LeetCode Medium Array Two-Pointers Binary-Search Bit-Manipulation
LeetCode 287 解題筆記:把 i -> nums[i] 看成鏈結串列,重複的值就是環的入口,用 Floyd 判圈;O(1) 空間、不改陣列
LeetCode 153: Find Minimum in Rotated Sorted Array
·1 分鐘
LeetCode Medium Array Binary-Search
LeetCode 153 解題筆記:拿 mid 跟右端比:nums[mid] > nums[r] 代表最小值在右邊,否則 mid 可能就是最小值,r = mid