代码随想录算法训练营第二十八天| 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 本题小结

  1. 这道题其实一个个的累加就是最终的结果,这一点开始没有想明白,但是我把代码写出来以后就理解了这个思路
  2. 真的也算是比较容易的题目吧,我也算是尝试写出来咯

2 leetcode55. 跳跃游戏

题目链接:55. 跳跃游戏 - 力扣(LeetCode)

文章链接:代码随想录

视频链接:贪心算法,怎么跳跃不重要,关键在覆盖范围 | 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 本题小结

  1. 我的思路是正确的,逐步遍历,如果找到一个位置的值比他的大,就可以了,但是写的时候不知道怎么写,就是卡在了这里
  2. 其实贪心算法核心思路真的是逐步找到全局最优

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 本题小结

  1. 看完以后,确实没想到去判断的这种方法,就卡在了,不知道怎么写
  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 本题小结

  1. 主要是排序的时候,我没想到将他们进行这种排序方法,然后就是导致我的题目陷入了局部最优

5 今日小结

  1. 主要是匿名函数使用,我当时没想明白
  2. 题目的思路,2、3、4的题目我当时都有一些不会的点,就写的不是很顺畅,有错的吧,二和三是没思路,四是可以写,但是我的代码还是陷入了局部最优,看了讲解以后,就很明白了
  3. 继续练习吧,还是有进步的空间
posted @ 2024-11-28 22:12  小方呀0524  阅读(18)  评论(0)    收藏  举报