代码随想录算法训练营第二十八天|122.买卖股票的最佳时机II 55. 跳跃游戏 45.跳跃游戏II 1005.K次取反后最大化的数组和

122.买卖股票的最佳时机II

122. 买卖股票的最佳时机 II - 力扣(LeetCode)

代码随想录

思路:这道题的关键是想到把相隔几天的出售转化为每一天的出售,例如第一天买,第三天卖,可以转化为第一天买,第二天卖,第二天买,第三天卖,所以说只需要统计每一天和前一天比的差值,如果能赚的钱大于0就视为买入,如果<=0,那就不买入

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        result=0
        for i in range(1,len(prices)):
            result+=max(prices[i]-prices[i-1],0)
        return result

55. 跳跃游戏

55. 跳跃游戏 - 力扣(LeetCode)

代码随想录

思路:不需要具体的考虑每一格怎么走到,只需要找到每一次能达到的最大范围,如果最大范围超过了最后一格,就可以,但如果一次计算过后,范围没有变化,说明无法到达最后一格,返回False

class Solution:
    def canJump(self, nums: List[int]) -> bool:
        end=nums[0]
        start=0
        if nums[0]>=len(nums)-1:
            return True
        while start<len(nums)-1:
            max_step=start+nums[start]
            for i in range(start+1,min(end+1,len(nums))):
                max_step=max(max_step,i+nums[i])
            if max_step<=end:
                return False
            start=end
            end=max_step
            if end>=len(nums)-1:
                return True
        return True



45.跳跃游戏II

45. 跳跃游戏 II - 力扣(LeetCode)

代码随想录

思路:这道题和上一道总体类似,也是循环的计算能到达的最远距离,一开始将step设为1,如果这个距离能达到,就返回当前的step,不能就把step+1,然后计算新的一轮的最远距离

class Solution:
    def jump(self, nums: List[int]) -> int:
        end=nums[0]
        start=0
        if len(nums)==1:
            return 0
        step=1
        if nums[0]>=len(nums)-1:
            return 1
        while start<len(nums)-1:
            max_step=start+nums[start]
            for i in range(start+1,min(end+1,len(nums))):
                max_step=max(max_step,i+nums[i])
            start=end
            end=max_step
            step+=1
            if end>=len(nums)-1:
                return step
            

1005.K次取反后最大化的数组和

1005. K 次取反后最大化的数组和 - 力扣(LeetCode)

代码随想录

思路:这道题感觉不能算贪心了,就是先排序,看能否把所有负数的取反,如果k的数量小于负数的数量就取反,如果超过,看超过的是奇数还是偶数,偶数就不管,奇数就把新的数组先重新排序,再把最小的取反

class Solution:
    def largestSumAfterKNegations(self, nums: List[int], k: int) -> int:
        nums.sort()
        cnt=0
        while cnt<len(nums) and nums[cnt]<0:
            cnt+=1
        if cnt>=k:
            for i in range(k):
                nums[i]=-nums[i]
        elif cnt<k:
            for i in range(cnt):
                nums[i]=-nums[i]
            nums.sort()
            if (k-cnt)%2==1:
                nums[0]=-nums[0]
        result=0
        for i in range(len(nums)):
            result+=nums[i]
        return result

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值