122.买卖股票的最佳时机II
class Solution {
//收益、贪心思想
public int maxProfit(int[] prices) {
//记录最大收益
int result = 0;
//因为收益只能从第二天卖出与第一天买入中做减法得到,所以从第二天开始遍历
for(int i = 1; i < prices.length; i++){
//遵循正收益思想,用第二天卖出减去第一天买入得到两天的净收益
//运用贪心收益思维,当遇见负收益时就跳过,用0累加
//即若当天卖出只能得到负收益,则不卖出
result += Math.max(prices[i] - prices[i - 1], 0);
}
return result;
}
}
55. 跳跃游戏
class Solution {
//以覆盖范围为基础进行算法推进
//当不断更新的覆盖范围达到了结尾,则说明可以完成这个跳跃游戏
public boolean canJump(int[] nums) {
//当数组元素只有一个时,本身肯定能跳到本身,所以返回true
if(nums.length == 1){
return true;
}
//初始覆盖范围为0
int coverRange = 0;
//在覆盖范围内更新并记录最大的覆盖范围
for(int i = 0; i <= coverRange; i++){
coverRange = Math.max(coverRange, i + nums[i]);
if(coverRange >= nums.length - 1){
return true;
}
}
//若在循环内未走到覆盖到结尾的逻辑,则说明无法跳到结尾,返回false
return false;
}
}
45.跳跃游戏II
class Solution {
public int jump(int[] nums) {
//当只有一个元素,可直接返回0,即不需要任何步数就可以完成游戏
if(nums.length == 1){
return 0;
}
//记录当前覆盖的最远距离下标,和下一步覆盖的最远距离元素的下标,初始化为0
//让二者以双指针形式进行推进
//debug点:要深刻理解下一步覆盖距离的意义及作用
int curDistance = 0;
int nextDistance = 0;
//记录移动的最小跳跃次数,初始化为0
int result = 0;
//遍历下标
for(int i = 0; i < nums.length - 1; i++){
//nextDistance为上一级覆盖范围内的元素,其最大的覆盖范围,
//作为下一级元素,更新下一级覆盖的最远距离的下标
nextDistance = Math.max(nums[i] + i, nextDistance);
//当i走到了当前覆盖的最远距离元素的下标的位置
//则需要向后推进一位,继承之前的最大范围,启动下一步覆盖范围,
//即:遍历完上一个覆盖范围后,更新当前最大覆盖范围,并增加步数
if(i == curDistance){
curDistance = nextDistance;
result++;
}
}
return result;
}
}