文档讲解:122.买卖股票的最佳时机II、55. 跳跃游戏、 45.跳跃游戏II
题目链接:122.买卖股票的最佳时机II、55. 跳跃游戏、 45.跳跃游戏II
思路:
贪心题真的是,思路想半天想不出来,看别人代码简单的一。只能说菜就多练。
首先第一题,常规做法是一个动归的题目。但是这里使用贪心算法更合适。买每一只股票的利润可以计算为每一天的净利润,所以可以建一个数组,保存每天的利润,每次往前走一步,将大于零的利润累加,返回大于零的利润总和。
第二题遍历每一步,并将能覆盖到的最远记录下来,如果能覆盖到最后一个,返回true,如果遍历过程中有到达不了的地址,返回false。
第三题以最小的步数增加最大的覆盖范围,直到覆盖范围覆盖了终点,这个范围内最少步数一定可以跳到,不用管具体是怎么跳的,不纠结于一步究竟跳一个单位还是两个单位。移动下标达到了当前覆盖的最远距离下标时,步数就要加一,来增加覆盖距离。最后的步数就是最少步数。
122.买卖股票的最佳时机II
class Solution {
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;
}
}
55. 跳跃游戏
class Solution {
public boolean canJump(int[] nums) {
if (nums.length == 1) {
return true;
}
int jumpNums = 0;
for(int i=0;i<=jumpNums;i++){
jumpNums = Math.max(jumpNums, i + nums[i]);
if (jumpNums >= nums.length - 1) {
return true;
}
}
return false;
}
}
45.跳跃游戏II
class Solution {
public int jump(int[] nums) {
if(nums.length==1) return 0;
int res=0;
int curInstence=0;
int maxInstence=0;
for(int i=0;i<nums.length;i++){
maxInstence = Math.max(maxInstence, nums[i]+i);
if(maxInstence>=nums.length-1){
res++;
break;
}
if(curInstence == i){
curInstence = maxInstence;
res++;
}
System.out.println(i+" "+curInstence+" "+maxInstence);
}
return res;
}
}