甜品网站建设项目规划书,翻译建设企业网站,wordpress 公众账号,手机能看的你们知道的文章目录 122.买卖股票的最佳时机II思路思路代码官方题解困难 55. 跳跃游戏思路思路代码官方题解代码困难 45.跳跃游戏II思路思路代码困难 今日收获 122.买卖股票的最佳时机II
122.买卖股票的最佳时机II
思路
局部最优#xff1a;将当天价格和前一天比较#xff0c;价格涨… 文章目录 122.买卖股票的最佳时机II思路思路代码官方题解困难 55. 跳跃游戏思路思路代码官方题解代码困难 45.跳跃游戏II思路思路代码困难 今日收获 122.买卖股票的最佳时机II
122.买卖股票的最佳时机II
思路
局部最优将当天价格和前一天比较价格涨了就买入价格降了就忽略。
思路代码
func maxProfit(prices []int) int {res:0pre:prices[0]for i:1;ilen(prices);i{if prices[i]pre{res(prices[i]-pre)}preprices[i]}return res
}官方题解
官方亦是如此。
困难
不需要第一天所以循环从第二天也就是1开始。 55. 跳跃游戏
55.跳跃游戏
思路
局部最优每次选取能覆盖的最大范围说明范围以内的
思路代码
func canJump(nums []int) bool {cover:0for i:0;ilen(nums);i{for j:i;jcover;j{if coverinums[i]{coverinums[i]}if coverlen(nums)-1{return true}}}return false
}官方题解
那么这个问题就转化为跳跃覆盖范围究竟可不可以覆盖到终点
每次移动取最大跳跃步数得到最大的覆盖范围每移动一个单位就更新最大覆盖范围。
贪心算法局部最优解每次取最大跳跃步数取最大覆盖范围整体最优解最后得到整体最大覆盖范围看是否能到终点。
局部最优推出全局最优找不出反例 i 每次移动只能在 cover 的范围内移动每移动一个元素cover 得到该元素数值新的覆盖范围的补充让 i 继续移动下去。 而 cover 每次只取 max(该元素数值补充后的范围, cover 本身范围)。 如果 cover 大于等于了终点下标直接 return true 就可以了。
一个循环时间复杂度更优。
代码
func canJump(nums []int) bool {cover : 0n : len(nums)-1for i : 0; i cover; i { // 每次与覆盖值比较cover max(inums[i], cover) //每走一步都将 cover 更新为最大值if cover n {return true}}return false
}
func max(a, b int ) int {if a b {return a}return b
}困难
让i每次只能在cover内移动每次循环实时更新cover的值也就是循环的范围在循环的同时就可以扩大不需要两层循环。 45.跳跃游戏II
45.跳跃游戏II
思路
记录下一步的覆盖范围 局部最优走到当前覆盖范围后步数加一并更新当前覆盖范围。每一步都走到最远
思路代码
func jump(nums []int) int {cover:0res:0nextcover:0for i:0;ilen(nums)-1;i{if nextcovernums[i]i{nextcovernums[i]i}if icover{rescovernextcover}}return res
}困难
优化后只需要走到倒数第二个位置即可。因为题目说必定能到达终点。 今日收获
对贪心算法的局部最优有了更深的认识。 例如跳跃问题这种每次更新范围的问题使用一个循环贪心找到每一步覆盖的最大范围。