122.买卖股票的最佳时机II
思路:
将买入卖出的收益分解到每一天,只需要将每一天的收益(前一天买入)为+的值累加即可得到最大收益。
代码:
class Solution {
public int maxProfit(int[] prices) {
if(prices.length == 1) return 0;
int res = 0;
int[] everydayearn = new int[prices.length - 1];
//每一天相比前一天的利润放到everydayearn数组
for(int i = 1; i < prices.length; i++){
everydayearn[i - 1] = prices[i] - prices[i - 1];
}
for(int i = 0; i < everydayearn.length; i++){
if(everydayearn[i] > 0){
res+=everydayearn[i];
}
}
return res;
}
}
需要注意的点:
1、第一天只能买入,没有收益。
55. 跳跃游戏
思路:
统计到达每一步后的最大覆盖范围,如果最大覆盖范围超过最后一个下标,返回TRUE。
代码:
class Solution {
public boolean canJump(int[] nums) {
if(nums.length == 1) return true;
int coverage = 0;//可到达的下标
for(int i = 0; i <= coverage; i++){
coverage = Math.max(coverage, i + nums[i]);
if(coverage >= nums.length - 1) return true;
}
return false;
}
}
需要注意的点:
1、循环数组下标的终止条件是最大覆盖范围
45.跳跃游戏II
思路:
每一步走尽可能长的距离,在遍历这一步能到达的最大覆盖范围时,记录(用max)下一步能到达的最大覆盖范围,如果到达本步最大覆盖范围还没到结尾,说明需要再加一步。
代码:
class Solution {
public int jump(int[] nums) {
if(nums.length == 1) return 0;
int res = 0;
//当前覆盖范围,超过了循环下标到这一步还没有终结说明需要+1步
int cur = 0;
int max = 0;//最大覆盖范围,在上一步的基础上,覆盖的最大范围
for(int i = 0; i < nums.length; i++){
max = Math.max(max, i + nums[i]);
if(max >= nums.length - 1){
res++;//再跳一步就能到最大长度处
break;
}
//走到当前覆盖的最大区域时,更新下一步可达的最大区域
if(i == cur){
res++;
cur = max;
}
}
return res;
}
}
需要注意的点:
1、注意初始条件设置。