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 h citations each."
Example:
Input:papers with at leastcitations = [0,1,3,5,6] Output: 3 Explanation:[0,1,3,5,6] means the researcher has5 papers in total and each of them had received 0, 1, 3, 5, 6 citations respectively. Since the researcher has3
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 來找,配合題意檢查和回傳對的值即可
Java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
} | |
} |
kotlin
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | |
} | |
} |
沒有留言:
張貼留言