122. 买卖股票的最佳时机II
把利润分解为每天为单位的维度,而不是从 0 天到第 3 天整体去考虑!其实我们需要收集每天的正利润就可以
/**
* @param {number[]} prices
* @return {number}
*/
var maxProfit = function (prices) {
let result = 0
for (let i = 1; i < prices.length; i++) {
result += Math.max(prices[i] - prices[i - 1], 0)
}
return result
};
55.跳跃游戏
将这个问题转化为跳跃覆盖范围究竟可不可以覆盖到终点
每次移动取最大跳跃步数(得到最大的覆盖范围),每移动一个单位,就更新最大覆盖范围。
/**
* @param {number[]} nums
* @return {boolean}
*/
var canJump = function (nums) {
if (nums.length === 1) return true
let cover = 0
for (let i = 0; i <= cover; i++) {
cover = Math.max(cover, i + nums[i])
if (cover >= nums.length - 1) {
return true
}
}
return false
};
45. 跳跃游戏II
要从覆盖范围出发,不管怎么跳,覆盖范围内一定是可以跳到的,以最小的步数增加覆盖范围,覆盖范围一旦覆盖了终点,得到的就是最小步数!
移动下标只要遇到当前覆盖最远距离的下标,直接步数加一,不考虑是不是终点的情况。
如果移动下标不等于当前覆盖最大距离下标,说明当前覆盖最远距离就可以直接达到终点了,不需要再走一步。
/**
* @param {number[]} nums
* @return {number}
*/
var jump = function (nums) {
let curIndex = 0
let nextIndex = 0
let steps = 0
for (let i = 0; i < nums.length - 1; i++) {
nextIndex = Math.max(nums[i] + i, nextIndex)
if (i === curIndex) {
curIndex = nextIndex
steps++
}
}
return steps
};