一、买卖股票的最佳时机2
局部最优:收集每天的正利润
全局最优:求得最大利润
/**
* @param {number[]} prices
* @return {number}
*/
var maxProfit = function(prices) {
let ans = 0
for(let i = 1; i < prices.length;i++) {
ans += Math.max(0, prices[i] - prices[i-1])
}
return ans
};
二、跳跃游戏
局部最优:每次取最大跳跃步数
整体最优:最后得到整体最大覆盖范围,能否覆盖终点
/**
* @param {number[]} nums
* @return {boolean}
*/
var canJump = function(nums) {
let cover = 0
// 注意这里是cover
for(let i = 0; i <= cover; i++) {
cover = Math.max(cover, nums[i] + i)
if(cover >= nums.length - 1) {
return true
}
}
return false
};
三、跳跃游戏2
统计两个覆盖范围,当前这一步的最大覆盖和下一步最大覆盖
如果到了移动位置等于最大覆盖且没有到达终点,必须再走一步来增加覆盖范围
对于索引到达最远覆盖距离,如果是集合终点,不需要加1,不是的话,继续加1,这个可以通过i < nums.length - 1简化,当下标指向nums.length - 2,在走一步,肯定可以到达终点,否则,已经覆盖到终点了
/**
* @param {number[]} nums
* @return {number}
*/
var jump = function(nums) {
let curDistance = 0
let nextDistance = 0
let ans = 0
for(let i = 0; i < nums.length - 1; i++) {
nextDistance = Math.max(nums[i] + i, nextDistance)
if(i === curDistance) {
curDistance = nextDistance
ans++
}
}
return ans
};