leetcode@ [274/275] H-Index & H-Index II (Binary Search & Array)

https://leetcode.com/problems/h-index/

Given an array of citations (each citation is a non-negative integer) of a researcher, write a function to compute the researcher's h-index.

According to the definition of h-index on Wikipedia: "A scientist has index h if h of his/her N papers have at least h citations each, and the otherN − h papers have no more than h citations each."

For example, given citations = [3, 0, 6, 1, 5], which means the researcher has 5 papers in total and each of them had received 3, 0, 6, 1, 5 citations respectively. Since the researcher has 3 papers with at least 3 citations each and the remaining two with no more than 3citations each, his h-index is 3.

Note: If there are several possible values for h, the maximum one is taken as the h-index.

Hint:

  1. An easy approach is to sort the array first.
  2. What are the possible values of h-index?
  3. A faster approach is to use extra space.
class Solution {
public:
    int getIdx(vector<int>& vec, int val) {
        if(vec.size() <= 0) return -1;
        int low = 0, high = vec.size()-1;
        while(low < high) {
            int mid = low + (high-low)/2;
            if(vec[mid] < val) low = mid+1;
            else high = mid;
        }
        return low;
    }
    int hIndex(vector<int>& citations) {
        if(citations.size() == 0) return 0;
        if(citations.size() == 1) {
            if(citations[0] == 0) return 0;
            return 1;
        }
        sort(citations.begin(), citations.end());
        if(citations[citations.size()-1] == 0) return 0;
        
        int res = INT_MIN;
        int low = 0, high = citations.size();
        while(low < high) {
            int mid = low + (high - low)/2;
            if(mid <= citations.size()-getIdx(citations, mid)) {
                low = mid;
                res = max(res, mid);
            }
            else high = mid;
            if(high - low <= 1) break;
        }
        
        if(low <= citations.size()-getIdx(citations, low)) {
            res = max(res, low);
        }
        if(high <= citations.size()-getIdx(citations, high)) {
            res = max(res, high);
        }
        return res;
    }
};
leetcode 263: H-Index
class Solution {
public:
    int getIdx(vector<int>& vec, int val) {
        if(vec.size() <= 0) return -1;
        int low = 0, high = vec.size()-1;
        while(low < high) {
            int mid = low + (high-low)/2;
            if(vec[mid] < val) low = mid+1;
            else high = mid;
        }
        return low;
    }
    int hIndex(vector<int>& citations) {
        if(citations.size() == 0) return 0;
        if(citations.size() == 1) {
            if(citations[0] == 0) return 0;
            return 1;
        }
        //sort(citations.begin(), citations.end());
        if(citations[citations.size()-1] == 0) return 0;
        
        int res = INT_MIN;
        int low = 0, high = citations.size();
        while(low < high) {
            int mid = low + (high - low)/2;
            if(mid <= citations.size()-getIdx(citations, mid)) {
                low = mid;
                res = max(res, mid);
            }
            else high = mid;
            if(high - low <= 1) break;
        }
        
        if(low <= citations.size()-getIdx(citations, low)) {
            res = max(res, low);
        }
        if(high <= citations.size()-getIdx(citations, high)) {
            res = max(res, high);
        }
        return res;        
    }
};
leetcode 264: H-Index II
原文地址:https://www.cnblogs.com/fu11211129/p/5012971.html