一、122.买卖股票的最佳时机II
这道题的精髓是:把相邻的两天捆绑到一起,如果第二天比第一天高,则在第一天买入,第二天卖出;如果第二天比第一天低,则不进行操作。
以下是代码部分:
public class 买卖股票的最佳时机II122 {
//看的题解:思路——>算出每天较前一天的利益,如果是正收益,就在前一天买入,否则不买
public int maxProfit(int[] prices) {
int result = 0;
for (int i = 1; i < prices.length; i++) {
result += Math.max(prices[i]-prices[i-1], 0);
}
return result;
}
}
二、55.跳跃游戏
这道题注意理解:跳跃的最大长度,而不是跳跃的固定长度。所以遍历一遍数组,记录数组中可以到达的最大位置。
在写代码时需要注意的点:在for循环中,i<=max(局部的最大值),而非nums.length。不断更新max,直到max>=nums.length,证明可以到达最后。
以下是代码部分:
public class 跳跃游戏55 {
//这道题理解错题意了:题目的意思是跳跃的最大长度(而不是跳跃的固定长度)
public boolean canJump(int[] nums) {
//记录局部的最大值
int max = 0;
//踩坑: 这里是max,而不是nums.length。因为他能遍历到的最大范围就是max
for (int i = 0; i <= max; i++) {
//如果当前跳的最大值大于max,则赋给max
//踩坑,这里是i+nums[i],而不是nums[i]
if( i + nums[i] > max )
max = nums[i] + i;
//如果最大长度大于等于length-1,return
if( max >= nums.length-1 )
return true;
}
return false;
}
}
三、45.跳跃游戏Ⅱ
理解本题的关键在于:以最小的步数增加最大的覆盖范围,直到覆盖范围覆盖了终点,这个范围内最小步数一定可以跳到,不用管具体是怎么跳的,不纠结于一步究竟跳一个单位还是两个单位。
以下是代码部分:
public class 跳跃游戏Ⅱ45 {
//思路:传送门
public int jump(int[] nums) {
//踩坑:=1时直接返回0。否则会默认跳一次
if(nums.length == 1)
return 0;
// 起点的时候多记录一次
int result = 0;
//记录局部
int local = 0;
int temp = 0;
for (int i = 0; i <= local; i++) {
if(i + nums[i] >= nums.length-1){
result++;
break;
}
//更新result
temp = Math.max( temp, i + nums[i]);
//转到下一个区域
if( i == local){
local = temp;
result++;
}
}
return result;
}
}