LeetCode--274. H-Index & 275. H-Index II
阿新 • • 發佈:2019-01-13
問題連線:https://leetcode.com/problems/h-index/和https://leetcode.com/problems/h-index-ii/
這兩個問題屬於一個問題,第二個的引用數陣列已經排序,有對數時間複雜度要求。H-index的概念理解還是很撓頭的。舉個例子:
0 3 5 5 6和0 1 3 5 6:到底是陣列值(高被引文章的引用數)重要還是高被引篇數重要呢?顯然是高被引篇數(科研防止灌水的指標),篇數大於等於某個陣列值時才可能是H-index,說明
思路:先排序,然後搜尋,最壞時間複雜度為O(n)。
class Solution { public int hIndex(int[] citations) { //0 3 5 5 6 Arrays.sort(citations); int i=0; for(;i<citations.length;i++) { if(citations[i]>=citations.length-i) break; } return citations.length-i; } }
思路:要求對數複雜度,既然是對數複雜度,那必然是用二分法,這裡使用左閉右閉區間的二分法版本,這種寫法要注意每次while迴圈都要判斷等於目標值的情況,對於左右值的變化可以舉幾個例子幫助自己理解,如下幾個例子:
//0 3 5 5 6
//0 1 2 2 5 6
//0 1 5 5 5 6
class Solution { public int hIndex(int[] citations) { //0 3 5 5 6 //0 1 2 2 5 6 //0 1 5 5 5 6 int lo=0,hi=citations.length-1; while(lo<=hi) { int mid=lo+(hi-lo)/2; if(citations[mid]==citations.length-mid)//找到第一個引用數等於篇數,直接返回篇數 return citations.length-mid; else if(citations[mid]<citations.length-mid)//引用數小於大於等於該引用數文章的篇數,例如0 1 2 2 5 6的2<4,需要向後繼續搜尋 lo=mid+1; else hi=mid-1;//引用數大於大於等於該引用數文章的篇數(說明較高水平文章佔了超過一半),例如0 1 5 5 5 6的5>4,需要向前繼續搜尋 } return citations.length-lo; } }
這個解法Beat 100%真的爽歪歪!!!我們一定要掌握二分搜尋的兩種bugfree的寫法,不能混淆!