int currentEnd = 0;//表示当前这一次跳跃所能到达的最远位置的边界,初始值为 0,意味着刚开始还未进行跳跃。
int farthest = 0;//记录从当前位置以及之前的位置出发,所能到达的最远位置,初始值为 0。
for (int i = 0; i < n - 1; i++) {
farthest = Math.max(farthest, i + nums[i]);
/*i + nums[i] 表示从当前位置 i 出发,根据该位置上的数字 nums[i] 所能跳跃到的最远位置。
使用 Math.max 函数比较 farthest 和 i + nums[i] 的大小,
将较大值赋给 farthest,以此更新从当前位置以及之前的位置出发所能到达的最远位置。*/
if (i == currentEnd) { //已经到达了当前这一次跳跃所能到达的最远位置的边界。
jumps++; //进行一次新的跳跃,所以将跳跃次数 jumps 加 1。
currentEnd = farthest; //表示新的一次跳跃所能到达的最远位置的边界。
}
}
return jumps;
}
}
复制代码
复杂度分析
时间复杂度: O ( n ) O(n) O(n), n 是数组的长度。只举行一次遍历。
空间复杂度: O ( 1 ) O(1) O(1). 11、H指数
需求:给你一个整数数组 citations ,其中 citations 表现研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。
根据维基百科上 h 指数的界说:h 代表“高引用次数” ,一名科研人员的 h 指数 是指他(她)至少发表了 h 篇论文,并且 至少 有 h 篇论文被引用次数大于等于 h 。如果 h 有多种大概的值,h 指数 是其中最大的那个。
方法一
排序法
整体思绪
先将引用次数数组按降序分列,然后从大到小遍历排序后的数组,找出满意条件的最大 h 值。
代码表现
import java.util.Arrays;
class Q11_1 {
public int hIndex(int[] citations) {
Arrays.sort(citations);
/*运用 Arrays.sort() 方法对 citations 数组进行升序排序。
排序后,数组中的元素按引用次数从小到大排列。*/
int h = 0, i = citations.length - 1;
while (i >= 0 && citations[i] > h) {
h++;
i--;
}
/*i >= 0 确保索引 i 在数组的有效范围内。
citations[i] > h 表示当前论文的引用次数大于当前的 h 指数,意味着可以继续增加 h 指数。*/
return h;
}
}
复制代码
复杂度分析
时间复杂度:O(nlogn),其中 n 为数组 citations 的长度。即为排序的时间复杂度。
空间复杂度:O(logn),其中 n 为数组 citations 的长度。即为排序的空间复杂度。