代码随想录算法训练营第二十八天| leetcode122.买卖股票的最佳时机 II、leetcode55. 跳跃游戏、leetcode45.跳跃游戏 II、leetcode1005.K次取反后最大化的数组和
1 leetcode122.买卖股票的最佳时机 II
题目链接:122. 买卖股票的最佳时机 II - 力扣(LeetCode)
文章链接:代码随想录
视频链接:贪心算法也能解决股票问题!LeetCode:122.买卖股票最佳时机II_哔哩哔哩_bilibili
思路:自己不知道怎么写出来的一道题目,就觉得理解上面就是找到了方法,但是后面再去想的时候,其实我当时陷入不知道示例2怎么求,但是答案写完再去思考,其实就是逐步累加也是正确的
1.1 自己的方法
class Solution:
def maxProfit(self, prices: List[int]) -> int:
curdiff = 0
result =0
for i in range(len(prices)-1):
curdiff = prices[i+1]-prices[i]
if curdiff>0:
result += curdiff
return result
1.2视频后的方法
使用max函数是我没想到的,他的方法也超级容易
class Solution:
def maxProfit(self, prices: List[int]) -> int:
result =0
for i in range(len(prices)-1):
result += max(prices[i+1]-prices[i],0)
return result
1.3 本题小结
- 这道题其实一个个的累加就是最终的结果,这一点开始没有想明白,但是我把代码写出来以后就理解了这个思路
- 真的也算是比较容易的题目吧,我也算是尝试写出来咯
2 leetcode55. 跳跃游戏
文章链接:代码随想录
视频链接:贪心算法,怎么跳跃不重要,关键在覆盖范围 | LeetCode:55.跳跃游戏_哔哩哔哩_bilibili
思路:其实我想到了这种方法,但是我不知道应该怎么写覆盖的范围,想的是只要找到了这个值就好了,看了详解后就很能理解了
2.1 视频后的思路
这种循环,是将其嵌套在里面,保证了覆盖范围的同时也遍历了所有的数据
class Solution:
def canJump(self, nums: List[int]) -> bool:
cover = 0
if len(nums)==1:
return True
i=0
while i<=cover:
cover =max(i+nums[i],cover)
if cover >= len(nums)-1:
return True
i+=1
return False
2.2 for循环的方法
class Solution:
def canJump(self, nums: List[int]) -> bool:
cover = 0
if len(nums)==1:
return True
for i in range(len(nums)):
if i<=cover:
cover =max(i+nums[i],cover)
if cover >= len(nums)-1:
return True
return False
2.3 本题小结
- 我的思路是正确的,逐步遍历,如果找到一个位置的值比他的大,就可以了,但是写的时候不知道怎么写,就是卡在了这里
- 其实贪心算法核心思路真的是逐步找到全局最优
3 leetcode45.跳跃游戏 II
题目链接:45. 跳跃游戏 II - 力扣(LeetCode)
文章链接:代码随想录
视频链接:贪心算法,最少跳几步还得看覆盖范围 | LeetCode: 45.跳跃游戏II_哔哩哔哩_bilibili
思路:我知道应该怎么走,但是呢,不知道怎么写
3.1 视频后的思路
我感觉我好像听懂了逻辑吧,但实现的过程怎么说呢,还是有点迷糊的
class Solution:
def jump(self, nums: List[int]) -> int:
if len(nums)==1:
return 0
cur = 0
next_jump = 0
result = 0
for i in range(len(nums)):
next_jump = max(i+nums[i],next_jump)
if i == cur:
result +=1
cur = next_jump
if cur>=len(nums)-1:
break
return result
3.2 本题小结
- 看完以后,确实没想到去判断的这种方法,就卡在了,不知道怎么写
- 听完以后其实还是有点迷惑,不知道为啥,但是好在弄出来了一点
4 leetcode1005.K次取反后最大化的数组和
题目链接:1005. K 次取反后最大化的数组和 - 力扣(LeetCode)
文章链接:代码随想录
视频链接:贪心算法,这不就是常识?还能叫贪心?LeetCode:1005.K次取反后最大化的数组和_哔哩哔哩_bilibili
思路:我的做法,满足了一部分的题目要求,但是呢不满足全部的要求
4.1 满足了一小部分的要求
怎么说呢,当负数排序完以后,就会出现陷入局部最优点了,没有跳出来
class Solution:
def largestSumAfterKNegations(self, nums: List[int], k: int) -> int:
nums.sort()
n = 0
sort_n=0
while sort_n<k:
if nums[-1]<0 or (nums[n]<0 and nums[n+1]<=0) :
nums[n] = -nums[n]
n+=1
else:
nums[n] = -nums[n]
sort_n+=1
return sum(nums)
4.2 视频后的思路
确实没想到按照顺序去排序,匿名函数这里使用的也不熟练
class Solution:
def largestSumAfterKNegations(self, nums: List[int], k: int) -> int:
nums.sort(key = lambda x: abs(x), reverse =True)
for i in range(len(nums)):
if nums[i]<0 and k>0:
nums[i] = -nums[i]
k-=1
if k %2 !=0:
nums[-1] = -nums[-1]
return sum(nums)
4.3 本题小结
- 主要是排序的时候,我没想到将他们进行这种排序方法,然后就是导致我的题目陷入了局部最优
5 今日小结
- 主要是匿名函数使用,我当时没想明白
- 题目的思路,2、3、4的题目我当时都有一些不会的点,就写的不是很顺畅,有错的吧,二和三是没思路,四是可以写,但是我的代码还是陷入了局部最优,看了讲解以后,就很明白了
- 继续练习吧,还是有进步的空间

浙公网安备 33010602011771号