这题容易陷入的地方就是会思考从哪天买到哪天卖利润最大,这样想的话题目就会变得很复杂了。这里有个巧妙的方法,其实某天到某天的利润最大,就是在这几天里哪几天利润都是正数,然后把这几天利润加起来就是最大的利润了,所以只要把每天的利润计算出来,把正利润相加,就是最大利润了。
class Solution {
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;
}
}
这题同样容易陷入进去,就会考虑每个位置跳几步才能跳到目标位置。其实每一个位置上只要跳最大步数就行,一定会跳到目标位置上去。这里引入一个覆盖范围的概念,每个位置的最大步数就叫这一步的覆盖范围,在这个覆盖范围上的位置都能跳上去。所以每个位置都跳最大步数,不断更新最大覆盖范围,当最大覆盖范围大于或者等于目标位置时,就是true
class Solution {
public boolean canJump(int[] nums) {
int end=0;
for(int i=0;i<=end;i++){
end=Math.max(nums[i]+i,end);
if(end>=nums.length-1){
return true;
}
}
return false;
}
}
这一题和上一题有些不同,这一题是要求最小步数。同样使用上一题中的覆盖范围。要求最小步数的话,就是要求每一步要走最大步数,才能以最小步数走到目标位置。那么什么时候往后跳一步刷新最大覆盖范围呢?就是当遍历到当前覆盖范围的最后位置时,往后跳一步刷新范围,但是跳到什么位置能保证刷新的是最大覆盖范围呢?我们用一个值来记录覆盖范围内的位置所能刷新的最大覆盖范围,跳的时候就跳到这个位置上去。
class Solution {
public int jump(int[] nums) {
if(nums.length==1){
return 0;
}
int curdistance=0;
int maxdistance=0;
int count=0;
for(int i=0;i<nums.length;i++){
//在可更新的覆盖范围内记录最大覆盖范围
maxdistance=Math.max(nums[i]+i,maxdistance);
if(maxdistance>=nums.length-1){
count++;//再跳一步到达
break;
}
if(i==curdistance){
curdistance=maxdistance;
count++;
}
}
return count;
}
}