题目简介
1005. K 次取反后最大化的数组和
给你一个整数数组 nums 和一个整数 k ,按以下方法修改该数组:
选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。
重复这个过程恰好 k 次。可以多次选择同一个下标 i 。
以这种方式修改数组后,返回数组 可能的最大和 。
134. 加油站
在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。
你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。
给定两个整数数组 gas 和 cost ,如果你可以按顺序绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1 。如果存在解,则 保证 它是 唯一 的。
135. 分发糖果
n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。
你需要按照以下要求,给这些孩子分发糖果:
每个孩子至少分配到 1 个糖果。
相邻两个孩子评分更高的孩子会获得更多的糖果。
请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目 。
初见思路
- 按照绝对值倒序排序,将负值转换为正,如果最后剩余K值,将绝对值最小的变为负。
class Solution:
def largestSumAfterKNegations(self, nums: List[int], k: int) -> int:
nums = sorted(nums,reverse=True,key=lambda x:abs(x))
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
return sum(nums)
134.如果唯一路径存在,那么从唯一合法起点开始,全局的剩余耗油应该大于0,且唯一合法起点的载油量应该是大于0的,由此可以得到以下解,和贪心思想关系并不大了:
class Solution:
def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:
if len(gas) == 0:
return -1
total,cur = 0,0
start = 0
for i in range(len(gas)):
cur += gas[i] - cost[i]
total += gas[i] - cost[i]
if cur < 0:
start = i + 1
cur = 0
return start if total >= 0 else -1
做题的时候,第一步还是先观察题目中是否存在某些特殊的数字规律,能用特殊规律,不轻易套算法模板。
- 对于这道题的两端比较,从左到右一次,从右到左一次就好。这种做法可以用到很多需要考虑两端值的场景上,记住做不了O(N) 的时候想2*O(N).
class Solution:
def candy(self, ratings: List[int]) -> int:
candy_vec = [1] * len(ratings)
for i in range(1,len(ratings)):
if ratings[i] > ratings[i - 1]:
candy_vec[i] = candy_vec[i-1] + 1
for i in range(len(ratings)-2,-1,-1):
if ratings[i] > ratings[i+1]:
candy_vec[i] = max(candy_vec[i+1]+1,candy_vec[i])
return sum(candy_vec)
复盘思路
https://programmercarl.com/0134.%E5%8A%A0%E6%B2%B9%E7%AB%99.html
https://programmercarl.com/0135.%E5%88%86%E5%8F%91%E7%B3%96%E6%9E%9C.html