1005.K次取反后最大化的数组和
class Solution:
def largestSumAfterKNegations(self, nums: List[int], k: int) -> int:
nums.sort()
for i in range(len(nums)):
if nums[i] < 0 and k > 0:
nums[i] = -nums[i]
k -= 1
if k % 2 == 1:
nums.sort()
nums[0] *= -1
return sum(nums)
134. 加油站
暴力法尝试失败
用贪心
rest = 0 #这三个条件缺一不可,rest和totalrest是后面要rest+,必须设0
totalrest = 0
index = 0 #index是如果遇到从i=0开始,就一直能往下走,index一直未更新,最后返 回0.
for i in range(len(gas)):
rest += gas[i] - cost[i]
totalrest += gas[i] - cost[i]
if rest < 0:
index = i + 1
rest = 0
if totalrest < 0:
return -1
return index
或者这样写:(这样思路更顺畅点)
class Solution:
def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:
rest = 0
index = 0
if sum(gas) - sum(cost) < 0: #先做判断
return -1
for i in range(len(gas)):
rest += gas[i] - cost[i]
if rest < 0:
index = i + 1
rest = 0
return index
【思考】这道题的题解要多练习
135. 分发糖果
class Solution:
def candy(self, ratings: List[int]) -> int:
dp = [1] * len(ratings)
for i in range(1, len(ratings)):
if ratings[i] > ratings[i - 1]:
dp[i] = dp[i - 1] + 1
for i in range(len(ratings) - 2, -1, -1):
if ratings[i] > ratings[i + 1]:
dp[i] = max(dp[i + 1] + 1, dp[i])
return sum(dp)
【思路】1.从左到右,比较右是否比左大
2.从右到左,比较左是否比右大。注意遍历顺序,从右到左才能利用上之前的信息,且用了max。