LEETCODE-DAY34

文章讲述了在LeetCode编程挑战中的三个问题,涉及数组操作如取反以最大化和值,使用贪心策略解决加油站问题(判断是否能完成环形行程),以及分发糖果问题(确保每个孩子得到至少一颗糖果)。解决方案展示了如何将问题拆分为子问题并采用相应策略求解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


title: LEETCODE-DAY34
date: 2024-03-25 22:02:33
tags:

今日内容:1005.K次取反后最大化的数组和、134. 加油站、135. 分发糖果

T1

class Solution:
    def largestSumAfterKNegations(self, nums: List[int], k: int) -> int:
        nums.sort()
        l=len(nums)
        i=0
        while i <=k :
            if nums[i]< 0:
                nums[i]=-nums[i]
                i+=1
            elif nums[i]==0:
                return sum(nums)
            else:
                nums.sort()
                if k-i % 2 ==0:
                    return sum(nums)
                else:
                    nums[0]=-nums[0]
                    return sum(nums)
        

nums =
[2,-3,-1,5,-4]
k =
2
输出
null
预期结果
13

class Solution:
    def largestSumAfterKNegations(self, nums: List[int], k: int) -> int:
        nums.sort()
        l=len(nums)
        i=0
        while i <=k :
            if nums[i]< 0:
                nums[i]=-nums[i]
                i+=1
            elif nums[i]==0:
                return sum(nums)
            else:
                nums.sort()
                if k-i % 2 ==0:
                    return sum(nums)
                else:
                    nums[0]=-nums[0]
                    return sum(nums)

        return sum(nums)

nums =
[2,-3,-1,5,-4]
k =
2
输出
15
预期结果
13

class Solution:
    def largestSumAfterKNegations(self, nums: List[int], k: int) -> int:
        nums.sort()
        l=len(nums)
        i=0
        while i <=k-1 :
            if nums[i]< 0:
                nums[i]=-nums[i]
                i+=1
            elif nums[i]==0:
                return sum(nums)
            else:
                nums.sort()
                if k-i % 2 ==0:
                    return sum(nums)
                else:
                    nums[0]=-nums[0]
                    return sum(nums)

        return sum(nums)

nums =[2,-3,-1,5,-4]通过
输入
nums =
[-2,9,9,8,4]
k =
5
输出
28
预期结果
32

感觉没问题?不懂

T2

class Solution:
    def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:
        gas=gas+gas
        cost=cost+cost
        for i in range(len(gas)):
            if cost[i]>gas[i]:
                continue
            volume=0
            for j in range(i,i+len(gas)):
                if volume <0:
                    break
                volume+=gas[i]
                volume-=cost[i]
            if j==i+len(gas)-1:
                return i
        return -1
class Solution:
    def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:
        gas=gas+gas
        cost=cost+cost
        for i in range(len(gas)):
            if cost[i]>gas[i]:
                continue
            volume=0
            for j in range(i,i+len(gas)):
                volume+=gas[i]
                volume-=cost[i]
                if volume <0:
                    break
            if j==i+len(gas)-1 and volume >=0:
                return i
        return -1
class Solution:
    def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:
        gas=gas+gas
        cost=cost+cost
        for i in range(len(gas)):
            if cost[i]>gas[i]:
                continue
            volume=0
            for j in range(i,i+len(gas)):
                volume+=gas[i]
                if volume>= cost[i]:
                    volume-=cost[i]
                else:
                    volume-=cost[i]
                    break
            if j==i+len(gas)-1 and volume >=0:
                return i
        return -1

gas =
[2,3,4]
cost =
[3,4,3]
输出
2
预期结果
-1


T3

听完视频思路,一遍过

本题的想法很重要,把问题拆分成两个子问题,对每个子问题用贪心策略求解

本题中每个位置的值其实有两个约束,也即要在满足规则的条件下使得左端点与右端点的值均大于等于1

举例来说
rating=[1,2,2,5,4,3,2]

5对应的值不能取3因为按照规则4对应的值要比3小,以此类推后四位对应的值为[3,2,1,0]末尾矛盾了
同理也要检查队首是否满足条件,此时5对应的值取3是可以的[1,2,1,3]

这样就把问题拆成了左右两个子问题

class Solution:
    def candy(self, ratings: List[int]) -> int:
        nums=[1]*len(ratings)
        nums2=[1]*len(ratings)
        for i in range(1,len(ratings)):
            if ratings[i]>ratings[i-1]:
                nums[i]=nums[i-1]+1
        j=len(nums)-2
        while j>=0:
            if ratings[j]>ratings[j+1]:
                nums2[j]=nums2[j+1]+1
            nums[j]=max(nums[j],nums2[j])
            j-=1
        nums[-1]=max(nums[-1],nums2[-1])
        return sum(nums)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值