274. H-Index
不定期更新leetcode解题java答案。
采用pick one的方式选择题目。
题意为给定数组为每篇论文被引用次数,要求找出一个值,满足论文被引用次数不小于这个值的篇数不小于这个值。
思路为,将数组排序,从后向前循环,即可获得超过某一篇文章被引用次数的篇数,再与该文章被引用篇数进行比较,出现该文章被引用篇数小于“超过该文章被引用篇数文章的数量”,则返回上一个结果即可。
代码如下:
1 public class Solution { 2 public int hIndex(int[] citations) { 3 Arrays.sort(citations); 4 int result = 0; 5 for(int i = 1; i <= citations.length; i++){ 6 if(citations[citations.length - i] >= i) 7 result = i; 8 else 9 break; 10 } 11 return result; 12 } 13 }
上述方法应用了函数库Arrays中的排序函数sort()。在尽量节省这个步骤,可以采用另一种思路进行解题:
构建一个(最大值+1)长度的数组,数组对应储存的值为论文被引用为该数目的篇数。由此进行统计,从前向后只要满足“总数-该数组位置(被引用次数)前的篇数=大于等于该篇数的论文数目>=该位置的值(被引用次数)”即可。
代码如下:
1 public class Solution { 2 public int hIndex(int[] citations) { 3 int max = 0; 4 for(int i = 0; i < citations.length; i++) 5 if(citations[i] > max) 6 max = citations[i]; 7 int[] count = new int[max + 1]; 8 9 for(int i = 0; i < citations.length; i++) 10 count[citations[i]]++; 11 12 int result = 0; 13 int total = 0; 14 for(int i = 0; i <= max; i++){ 15 if(citations.length - total >= i){ 16 result = i; 17 total += count[i]; 18 }else 19 break; 20 } 21 22 return result; 23 } 24 }
由于这种方式节省了排序步骤,时间复杂度上较前者更低。虽然max可能很大,但是由于论文数(citations.length)是固定值,所以即使进行从0~max的循环也没有用很长的时间。