1. 程式人生 > >LeetCode--274. H-Index & 275. H-Index II

LeetCode--274. H-Index & 275. H-Index II

問題連線: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的寫法,不能混淆!