122 买卖股票最佳时机
看完题后的思路
第一天买,第三天买的利润=
p3-p1=(p3-p2)+(p2-p1)
相邻两天为一个单元,计算出所有单元的利润,只取正利润。例如上图第二天第三天利润为正,等价于第一天买,第三天卖。
代码
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;
}
复杂度
时间: 0(n)
空间 0(1)
三刷
和DP一块刷一遍
55. 跳跃游戏
看完题后的思路
p: 当前还能跳多少步,p跳到i处
p与nums【i】比,
p=max(p,nums【i】)我要跳最大范围
然后i++;p–;
代码
// 55. 跳跃游戏
public boolean canJump(int[] nums) {
int p=0;
for (int i = 0; i < nums.length-1; i++) //在导数第二不为0就是成功{
p= Math.max(p,nums[i]);
if (p==0){
return false;
}
p--;
}
return true;
}
复杂度
收获
三刷刷一遍
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;
}
}