My code:
public class Solution {
public int hIndex(int[] citations) {
if (citations == null || citations.length == 0) {
return 0;
}
int ret = 0;
Arrays.sort(citations);
int n = citations.length;
for (int i = 0; i < n; i++) {
if (citations[i] + i >= n) {
return n - i;
}
}
return ret;
}
}
题目的意思没怎么搞懂。
其实就是以某个value为分界线,判断 数组中 >= 该value的元素个数是否 = 该value
所以,首先想到的是,给数组排序。
然后对于 nums[i]
= nums[i] 的个数 = nums.length – i
所以 , value = nums.length – i,以这个value划分,将会有 nums.length – i 个元素 >= 他
nums[i] >= value => nums[i] >= nums.length – i
排序的解法就出来了。
时间复杂度是 O(n log n)
但如果牺牲空间,有办法把时间降到 O(n) 吗?
于是想到了那几个不基于比较的排序算法。
counting sort, radix sort, bucket sort, 他们的复杂度可以达到 O(n)
但都要求,一定的已知的范围。
这道题目,citations 个数并没有范围。所以怎么用?
但是想到, 如果 citations >= n, 他们是多少,我们都无所谓了。
可以用 bucket sort
My code:
public class Solution {
public int hIndex(int[] citations) {
if (citations == null || citations.length == 0) {
return 0;
}
int n = citations.length;
int[] bucket = new int[n + 1];
for (int i = 0; i < citations.length; i++) {
if (citations[i] >= n) {
bucket[n] += 1;
}
else {
bucket[citations[i]] += 1;
}
}
int sum = 0;
for (int i = n; i >= 0; i--) {
sum += bucket[i];
if (sum >= i) {
return i;
}
}
return 0;
}
}
reference:
https://discuss.leetcode.com/topic/40765/java-bucket-sort-o-n-solution-with-detail-explanation/2
https://leetcode.com/articles/h-index/
Anyway, Good luck, Richardo! — 09/21/2016