1005.K次取反后最大化的数组和
分几步做,思路清晰
- 按绝对值从大到小的顺序进行排序
- 从前向后遍历,遇到负数将其变为正数,同时K--
- 如果K还大于0,那么反复转变数值最小的元素,将K用完
- 求和
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] *= -1k -= 1if k % 2 == 1:nums[-1] *= -1return sum(nums)
134. 加油站
class Solution:def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:curSum = 0totalSum = 0start = 0for i in range(len(gas)):curSum += gas[i] - cost[i]totalSum += gas[i] - cost[i]if curSum < 0:start = i+1curSum = 0if totalSum < 0:return -1return start
135. 分发糖果
class Solution:def candy(self, ratings: List[int]) -> int:result = [1] * len(ratings)# 看左边for i in range(1, len(ratings)):if ratings[i] > ratings[i-1]:result[i] = result[i-1] + 1# 看右边for i in range(len(ratings)-2, -1, -1):if ratings[i] > ratings[i+1]:result[i] = max(result[i+1] + 1, result[i])return sum(result)