class Solution:
def largestSumAfterKNegations(self, nums: List[int], k: int) -> int:
# 有负值优先反转负值
# 多个负值优先反转较小的
# 没有负值就反转最小的
while(k > 0):
nums[nums.index(min(nums))] = -min(nums)
k -= 1
return sum(nums)
class Solution:
def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:
if sum(gas) < sum(cost):
return -1
diff = [gas[i]- cost[i] for i in range(len(gas))]
_sum = 0
index = 0
for i,val in enumerate(diff):
_sum += val
if _sum < 0:
_sum = 0
index = i + 1
return index
gas就是增加的油 cost就是减少的油,得到他们的差值数组diff来表示如果从当前站出发,起始的油,我们要保证出发站起始的油累积到最大,能最大程度保证有解。和最大子序和的想法有点类似,统计diff数组的最大子序和的起点就可以了,起点就在_sum刚开始变正数的第一个值,因为题目说了有解的情况就一定存在一个唯一的解,所以能确保这种思路找到的值就是起点。如果gas的累计值大于cost的累计值,那就一定有解。
class Solution:
def candy(self, ratings: List[int]) -> int:
candys = [1 for i in range(len(ratings))]
for i in range(len(ratings) - 1):
if ratings[i] < ratings[i + 1]:
candys[i + 1] = candys[i] + 1
k = len(ratings) - 2
while(k >= 0):
if ratings[k] > ratings[k + 1]:
candys[k] = max(candys[k + 1] + 1, candys[k])
k -= 1
return sum(candys)
分两边遍历,从前向后只考虑右边大的情况
从后往前只考虑左边大的情况
然后第二次遍历取值要比较右边+1和当前值哪个大