122. 买卖股票的最佳时机 II
- 题目链接:122. 买卖股票的最佳时机 II
- 解题思路:可以把每天股票价格数组做差形成一个每天利润数组,然后用贪心每次都收集正利润,最后得到最大利润。第一天没有利润,要从第二天开始才有利润,所以利润数组比原价格数组短一位
- 主要难点:同时只能持有一笔股票,也就是每笔交易至少需要两天时间完成
- 解题时间:20+5
- 代码:
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. 跳跃游戏
- 题目链接:55. 跳跃游戏
- 解题思路:跳跃问题,每个位置的数值表示了能够跳跃最远的长度,可以转化成一个跳跃的范围,最终问题就转变为看跳跃范围能否覆盖终点的问题,于是贪心算法局部最优就是每一步都选最大范围,则全局最优就是得到最大的可行范围,判断是否覆盖终点
- 主要难点:不用考虑每次跳几步,而是转变为能跳最大步数的覆盖区间问题
- 解题时间:30+5
- 代码:
class Solution {
public boolean canJump(int[] nums) {
if(nums.length==1){
return true;
}
int cover = 0;
for(int i=0;i<=cover;i++){
cover=Math.max(cover,nums[i]+i);
if(cover>=nums.length-1){
return true;
}
}
return false;
}
}
45. 跳跃游戏 II
class Solution {
public int jump(int[] nums) {
if (nums == null || nums.length == 0 || nums.length == 1) {
return 0;
}
int count=0;
int curDistance = 0;
int maxDistance = 0;
for (int i = 0; i < nums.length; i++) {
maxDistance = Math.max(maxDistance,i+nums[i]);
if (maxDistance>=nums.length-1){
count++;
break;
}
if (i==curDistance){
curDistance = maxDistance;
count++;
}
}
return count;
}
}