清单
● 1005.K次取反后最大化的数组和
● 134. 加油站
● 135. 分发糖果
LeetCode #1005 K次取反后最大化的数组和
1. 题目
给你一个整数数组 nums 和一个整数 k ,按以下方法修改该数组:
选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。
重复这个过程恰好 k 次。可以多次选择同一个下标 i 。
以这种方式修改数组后,返回数组可能的最大和
2. 思路
初始思路:
对数组进行排序,增添一个参数count用于记录数组内的非负数,然后再判断count和k的大小关系再对数组内的元素进行处理
存在问题:
需要处理的情况很多,代码逻辑不够清晰,且做题过程中没含有贪心算法。
Carl哥思路:
当数组内元素有正有负时,尽量将负数元素变换为正数元素即可获得最大数组和
当数组内元素全为负时,尽量将绝对值较大的负数元素转变为正数元素即可获得最大数组和
当数组内元素全为正时,尽量将绝对值较小的正数元素转变为负数元素即可获取最大数组和
(局部优化 ——————> 全局最优解)
解题步骤:
- 对数组按照绝对值大小进行排序
- 遍历数组将负数变为正数,k–
- 若k还有剩余,转换数组最后一个元素直至k==0
- 求和
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)