1.力扣122(买卖股票的最佳时机)
本题我们可以多次买入,多次卖出,我们利用贪心算法来收集每天正收益,这就是我们贪心的地方,我们直接把相邻两天的数值相减,若为正就收集起来,若为负就跳过,当我们收集至尾部时也就是利益最大的时候。
public int maxProfit(int[] prices) {
int res = 0;
for(int i=1;i<prices.length;i++){
res+=Math.max(prices[i]-prices[i-1],0);
}
return res;
}
2.力扣55(跳跃游戏)
首先要把能否到达重点转换为能否覆盖终点,这样我们只需要计算每一段的覆盖范围,然后我么遍历覆盖范围从这个覆盖范围里寻找比当前覆盖范围大的数,随后我们更新这个cover并别判断能否覆盖到终点。
public boolean canJump(int[] nums) {
int cover = 0;
//若数组长度为1直接跳过
if(nums.length==1){
return true;
}
//遍历覆盖范围
for(int i=0;i<=cover;i++){
//计算出超过当前覆盖范围的数值
cover = Math.max(i+nums[i],cover);
//判断cover是否抱哈弄了数组尾部
if(cover>=nums.length-1){
return true;
}
}
return false;
}
3.力扣45(跳跃游戏II)
这个题相比于上一道的不同就是求出最小跳跃次数,但是我们本质不变,都是通过覆盖范围来判断,我们需要先定义一个end变量来控制结束条件,我们每次遍历start到end这个区间时求出一个最大的覆盖范围,然后我们将start=end,end=maxBoder来更新下次的覆盖范围,在进行此操作时我们还需要增加跳跃的次数,也就是ans++,直至end>=nums.length
public int jump(int[] nums) {
//记录跳跃次数
int ans = 0;
//记录遍历开始位置
int start = 0;
//记录遍历结束的位置
int end = 1;
//控制结束条件
while(end < nums.length){
//定义最大边界
int maxBorder = 0;
//找出最大的遍历覆盖范围
for(int i=start;i<end;i++){
maxBorder = Math.max(i+nums[i],maxBorder);
}
//向后更新区间
start = end;
end = maxBorder+1;
ans++;
}
return ans;
}