代码随想录 Day-33|#1005 K次取反后最大化的数组和 |#134 加油站 |#135 分发糖果

清单

● 1005.K次取反后最大化的数组和
● 134. 加油站
● 135. 分发糖果

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

1. 题目

给你一个整数数组 nums 和一个整数 k ,按以下方法修改该数组:
选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。
重复这个过程恰好 k 次。可以多次选择同一个下标 i 。
以这种方式修改数组后,返回数组可能的最大和

2. 思路

初始思路:
对数组进行排序,增添一个参数count用于记录数组内的非负数,然后再判断count和k的大小关系再对数组内的元素进行处理
存在问题:
需要处理的情况很多,代码逻辑不够清晰,且做题过程中没含有贪心算法。
Carl哥思路:
当数组内元素有正有负时,尽量将负数元素变换为正数元素即可获得最大数组和
当数组内元素全为负时,尽量将绝对值较大的负数元素转变为正数元素即可获得最大数组和
当数组内元素全为正时,尽量将绝对值较小的正数元素转变为负数元素即可获取最大数组和
(局部优化 ——————> 全局最优解)
解题步骤:

  1. 对数组按照绝对值大小进行排序
  2. 遍历数组将负数变为正数,k–
  3. 若k还有剩余,转换数组最后一个元素直至k==0
  4. 求和

3. 代码实现

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] *= -1
                k -= 1
        
        if k % 2 == 1:
            nums[-1] *= -1

        summary_result = sum(nums)
        return summary_result

LeetCode #134 加油站

1. 题目

在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。
你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。
如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。

2. 思路

初始思路:
添加参数start, cur_gas and total_gas,若 cur_gas < cost 则无法到达下一加油站,start + 1,若total_gas < 0则无法绕环路行驶一周。

3. 代码实现

class Solution:
    def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:
        start = 0
        cur_gas = 0
        total_gas = 0
        for i in range(len(gas)):
            cur_gas += gas[i] - cost[i]
            total_gas += gas[i] - cost[i] 

            if cur_gas < 0:
                cur_gas = 0
                start = i + 1

        if total_gas < 0:
            return -1
        return start

LeetCode #135 分发糖果

1. 题目

n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。
你需要按照以下要求,给这些孩子分发糖果:
每个孩子至少分配到 1 个糖果。
相邻两个孩子评分更高的孩子会获得更多的糖果。
请你给每个孩子分发糖果,计算并返回需要准备的最少糖果数目

2. 思路

初始思路:
遍历数组,当ratings[left +1] > ratings[left]时,糖果数量 + 1
存在问题:
无法通过全部实例,并未考察从后往前遍历时的糖果数量变更情况
Carl哥思路:
一次是从左到右遍历,只比较右边孩子评分比左边大的情况
一次是从右到左遍历,只比较左边孩子评分比右边大的情况

3. 代码实现

class Solution:
    def candy(self, ratings: List[int]) -> int:
        can = [1] * len(ratings)
        for left in range(len(ratings)-1):
            if ratings[left] < ratings[left + 1]:
                can[left + 1] = can[left] + 1
        
        for right in range(len(ratings)-2,-1,-1):
            if ratings[right] > ratings[right + 1]:
                can[right] = max(can[right],can[right+1] + 1)
        
        return sum(can)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值