2019年2月26日 星期二

[LeetCode] 275. H-Index II

轉自LeetCode

Given an array of citations sorted in ascending order (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 other N − h papers have no more than citations each."
Example:
Input: citations = [0,1,3,5,6]
Output: 3 
Explanation: [0,1,3,5,6] means the researcher has 5 papers in total and each of them had 
             received 0, 1, 3, 5, 6 citations respectively. 
             Since the researcher has 3
papers with at least 3 citations each and the remaining   two with no more than 3 citations each, her h-index is 3.
Note:
If there are several possible values for h, the maximum one is taken as the h-index.

<Soluion>

H-Index 的衍生題

解題想法:
  • 這次給的 input 已經是排序好的,所以可以直接拿來利用
  • 從題目來看,其實就是要找到一個一刀兩斷的 index,讓在這個點之上的所有值,都大於等於這個 index,在這個點之下的值,都小於等於這個 index
  • 綜合上述兩點,可以使用 binary search 來找,配合題意檢查和回傳對的值即可
code 如下
Java

class Solution {
public int hIndex(int[] citations) {
int left = 0, right = citations.length;
int mid, diff;
while(left < right) {
mid = left + (right - left) / 2;
diff = citations.length - mid;
if(diff == citations[mid]) {
return diff;
} else if(diff > citations[mid]){
left = mid+1;
} else {
right = mid;
}
}
return citations.length - left;
}
}
view raw hIndex_2.java hosted with ❤ by GitHub

kotlin
class Solution {
fun hIndex(citations: IntArray): Int {
var left = 0
var right = citations.size
while(left < right) {
val mid = left + (right - left) / 2
val diff = citations.size - mid
when {
diff == citations[mid] -> return diff
citations[mid] < diff -> left = mid+1
else -> right = mid
}
}
return citations.size - left
}
}
view raw h_index_II.kt hosted with ❤ by GitHub

沒有留言:

張貼留言