1005. K 次取反后最大化的数组和
题目链接:1005. K 次取反后最大化的数组和
这题自己写出来了,感觉没用到贪心。
class Solution:
def largestSumAfterKNegations(self, nums: List[int], k: int) -> int:
for i in range(k):
a= min(nums)
a_index=nums.index(a)
nums[a_index]=-nums[a_index]
return sum(nums)
134. 加油站
题目链接:134. 加油站
class Solution:
def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> 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
135. 分发糖果
题目链接:135. 分发糖果
没想到这题是个困难题目,而且反向遍历也很难想到。反向遍历的效果与从右往左是一样的。很巧妙。
class Solution:
def candy(self, rating: List[int]) -> int:
res=[1]*len(rating)
left=0
right=1
while right<len(rating):
if right<len(rating) and rating[left]<rating[right] and res[left]>= res[right]:
res[right]=res[left]+1
right+=1
left+=1
elif right<len(rating) and rating[left]>rating[right] and res[left]<=res[right]:
res[left] = res[right]+1
right += 1
left += 1
else:
right += 1
left += 1
for i in range(len(rating)-1,0,-1):
if rating[i - 1] > rating[i]:
# 如果相邻前一个数更大,那前一个孩子就要比后一个孩子多一个糖果,取左右遍历得到的最大数即满足左右循环且最小糖果数
res[i - 1] = max(res[i - 1], res[i] + 1)
return sum(res)
简洁版
class Solution:
def candy(self, ratings: List[int]) -> int:
# 先初始给每一个孩子一个糖果
ls = [1]*len(ratings)
# 从左往右遍历比较大小
for i in range(len(ratings)-1):
# 如果相邻后一个数更大,那后一个孩子就要比前一个孩子多一个糖果
if ratings[i+1] > ratings[i]:
ls[i+1]=ls[i]+1
# 从右往左遍历比较大小
for i in range(len(ratings)-1, 0, -1):
if ratings[i-1] > ratings[i]:
# 如果相邻前一个数更大,那前一个孩子就要比后一个孩子多一个糖果,取左右遍历得到的最大数即满足左右循环且最小糖果数
ls[i-1]=max(ls[i-1], ls[i]+1)
return sum(ls)