一. 学习文章及资料
二. 学习内容
收集正利润的区间,就是股票买卖的区间,而我们只需要关注最终利润,不需要记录区间。
那么只收集正利润就是贪心所贪的地方!
局部最优: 收集每天的正利润
全局最优:求得最大利润。
局部最优可以推出全局最优,找不出反例,试一试贪心!

java
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;
}
}
局部最优: 每次取最大跳跃步数(取最大覆盖范围)
**全局最优:**最后得到整体最大覆盖范围,看是否能到终点。
局部最优推出全局最优,找不出反例,试试贪心!

java
class Solution {
public boolean canJump(int[] nums) {
// 只有一个元素,就是能达到
if(nums.length==1) return true;
int far=0;
// 注意这里是小于等于far
for(int i=0;i<=far;i++){
far=Math.max(i+nums[i],far);
// 说明可以覆盖到终点了
if(far>=nums.length-1) return true;
}
return false;
}
}
从覆盖范围出发,不管怎么跳,覆盖范围内一定是可以跳到的,以最小的步数增加覆盖范围,覆盖范围一旦覆盖了终点,得到的就是最少步数!
这里需要统计两个覆盖范围,当前这一步的最大覆盖和下一步最大覆盖。
如果移动下标达到了当前这一步的最大覆盖最远距离了,还没有到终点的话,那么就必须再走一步来增加覆盖范围,直到覆盖范围覆盖了终点。

java
class Solution {
public int jump(int[] nums) {
int count=0; //记录的步数
int curDistant=0; //当前步数到达最远距离
int nextDistant=0;//下一步数到达最远距离
for(int i=0;i<nums.length;i++){
nextDistant=Math.max(i+nums[i],nextDistant);
if(nextDistant>=nums.length-1){ //如果下一步能到达终点
count++; //说明再走一步就行了
break;
}
if(i==curDistant){ //到达当前步数最远的地方还没到终点
curDistant=nextDistant; //更新覆盖距离
count++;
}
}
return count;
}
}