122.买卖股票的最佳时机II
题目链接:. - 力扣(LeetCode)
我的思路:股票是可以每天买卖的,其实只要记录每天的正利润(局部最优解),求和即是最大利润(全局最优解)
var maxProfit = function(prices) {
let result = 0
for(let i = 0; i < prices.length - 1; i = i + 1) {
curDiff = prices[i + 1] - prices[i]
if(curDiff > 0) {
result = result + curDiff
}
}
return result
};
55. 跳跃游戏
题目链接:. - 力扣(LeetCode)
思路:这里是求跳跃的最大覆盖范围,也就是遍历到当前元素的值,加上当前元素的索引(nums[i] + i);如果这个最大覆盖范围 大于等于最后一个值的索引,那么就是符合条件的;
那么如果遍历到的当前元素的索引已经大于这个覆盖范围了,那么则无法到达最后一个元素
代码实现:
var canJump = function(nums) {
let cover = 0;
for(let i = 0; i < nums.length - 1; i = i + 1) {
if(i > cover) {
return false
}
cover = Math.max(cover, nums[i] + i)
}
return cover >= nums.length - 1
};
贪心算法局部最优解:每次取最大跳跃步数(取最大覆盖范围),整体最优解:最后得到整体最大覆盖范围,看是否能到终点。
45.跳跃游戏II
题目链接:. - 力扣(LeetCode)
思路:遍历每一个元素,找到下一次更新的最大覆盖点;如果遍历到当前元素的坐标和当前的最大覆盖点相等的话,那跳跃次数就要更新了,当前的最大覆盖点也要更新为下次更新的最大覆盖点;
如果超了的话,则跳出
var jump = function(nums) {
if(nums.length === 1) return 0
let curPoint = 0, nextPoint = 0, result = 0;
for(let i = 0; i < nums.length; i = i + 1) {
nextPoint = Math.max(nextPoint, nums[i] + i);
if(curPoint === i) {
result = result + 1
curPoint = nextPoint
if(curPoint >= nums.length - 1) break
}
}
return result
};