第三十四天|贪心算法

今天的题还是比较难想到,需要培养感觉

1005. Maximize Sum Of Array After K Negations

基本思路就是先把负的变正的,再把最小的变成负的

Way1:

首先排序然后循环数组,当k>0时每次有负数则k-1并且负数变正数.之后如果k还是大于0则判断奇偶,奇数需要把最小的数变成负数,然后求和

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

134. Gas Station

这道题基本思路就是把两个数组的数据转成差值,并且进行相加判断是什么时候满足要求

Way1:

每次叠加gas和cost的差值,如果有负值则start为i+1,如果总的gas小于总的cost则没有一条线路可用

class Solution:
    def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:
        cursum=0
        total=0
        start=0
        for i in range(len(gas)):
            cursum+=+gas[i]-cost[i]
            total+=gas[i]-cost[i]
            if cursum<0:
                start=i+1
                cursum=0
        if total<0:
            return -1
        return start

135. Candy

这道题要分别处理左右进行叠代

Way1:

先处理所有的左邻居,如果当前rating的比左边的大,则当前需要左边的candy+1.之后处理右邻居,如果自己比右邻居评分高,则要判断自己当前的candy和右邻居的candy+1 谁大,之后求sum即可

class Solution:
    def candy(self, ratings: List[int]) -> int:
        candy=[1 for _ in range(len(ratings))]
        for i in range(1,len(ratings)):
            if ratings[i]>ratings[i-1]:
                candy[i]=candy[i-1]+1
        for i in range(len(ratings)-2,-1,-1):
            if ratings[i]>ratings[i+1]:
                candy[i]=max(candy[i+1]+1,candy[i])
        return sum(candy)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值