7.K次取反后最大化的数组和
给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次。(我们可以多次选择同一个索引 i。)
以这种方式修改数组后,返回数组可能的最大和。
class Solution:
def largestSumAfterKNegations(self, nums, k):
nums = sorted(nums, key=abs, reverse=True)
for i in range(len(nums)):
if k > 0 and nums[i] < 0:
nums[i] *= -1
k -= 1
if k > 0:
nums[-1] *= (-1) ** k
return sum(nums)
8.加油站
在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。
你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。
如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。
说明:
- 如果题目有解,该答案即为唯一答案。
- 输入数组均为非空数组,且长度相同。
- 输入数组中的元素均为非负数。
class Solution:
def canCompleteCircuit(self, gas, cost) -> int:
start = 0
cursum = 0
totalsum = 0
for i in range(len(gas)):
cursum += gas[i] - cost[i]
totalsum += gas[i] - cost[i]
if cursum < 0:
cursum = 0
start = i + 1
if totalsum < 0:return -1
return start
9.分发糖果
老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分。
你需要按照以下要求,帮助老师给这些孩子分发糖果:
- 每个孩子至少分配到 1 个糖果。
- 相邻的孩子中,评分高的孩子必须获得更多的糖果。
那么这样下来,老师至少需要准备多少颗糖果呢?
class Solution:
def candy(self, ratings) -> int:
candyVec = [1] * len(ratings)
for i in range(1, len(ratings)):
if ratings[i] > ratings[i - 1]:
candyVec[i] = candyVec[i - 1] + 1
for j in range(len(ratings) - 2, -1, -1):
if ratings[j] > ratings[j + 1]:
candyVec[j] = max(candyVec[j], candyV