122.买卖股票的最佳时机 II
局部最优,利润分解为每天为单位的维度,只收集正利润
比如输入: [7,1,5,3,6,4]
每天利润是:-6,4,-2,3,-2
只收集4+3=7
所获得的最大利润就是7
class Solution {
public int maxProfit(int[] prices) {
int profit=0;
for(int i=0;i<prices.length-1;i++){
if(prices[i+1]-prices[i]>0){
profit=profit+prices[i+1]-prices[i];
}
}
return profit;
}
}
55. 跳跃游戏
这道题目关键点在于:不用拘泥于每次究竟跳几步,而是看覆盖范围,覆盖范围内一定是可以跳过来的,不用管是怎么跳的。
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,i+nums[i]);//当前所在位置能到范围和之间记录的最大覆盖范围,取最大值
if(cover>=nums.length-1){return true;}
}
return false;
}
}
45.跳跃游戏II
class Solution {
public int jump(int[] nums) {
if(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;
}
}