title: LEETCODE-DAY34
date: 2024-03-25 22:02:33
tags:
今日内容:1005.K次取反后最大化的数组和、134. 加油站、135. 分发糖果
T1
class Solution:
def largestSumAfterKNegations(self, nums: List[int], k: int) -> int:
nums.sort()
l=len(nums)
i=0
while i <=k :
if nums[i]< 0:
nums[i]=-nums[i]
i+=1
elif nums[i]==0:
return sum(nums)
else:
nums.sort()
if k-i % 2 ==0:
return sum(nums)
else:
nums[0]=-nums[0]
return sum(nums)
nums =
[2,-3,-1,5,-4]
k =
2
输出
null
预期结果
13
class Solution:
def largestSumAfterKNegations(self, nums: List[int], k: int) -> int:
nums.sort()
l=len(nums)
i=0
while i <=k :
if nums[i]< 0:
nums[i]=-nums[i]
i+=1
elif nums[i]==0:
return sum(nums)
else:
nums.sort()
if k-i % 2 ==0:
return sum(nums)
else:
nums[0]=-nums[0]
return sum(nums)
return sum(nums)
nums =
[2,-3,-1,5,-4]
k =
2
输出
15
预期结果
13
class Solution:
def largestSumAfterKNegations(self, nums: List[int], k: int) -> int:
nums.sort()
l=len(nums)
i=0
while i <=k-1 :
if nums[i]< 0:
nums[i]=-nums[i]
i+=1
elif nums[i]==0:
return sum(nums)
else:
nums.sort()
if k-i % 2 ==0:
return sum(nums)
else:
nums[0]=-nums[0]
return sum(nums)
return sum(nums)
nums =[2,-3,-1,5,-4]通过
输入
nums =
[-2,9,9,8,4]
k =
5
输出
28
预期结果
32
感觉没问题?不懂
T2
class Solution:
def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:
gas=gas+gas
cost=cost+cost
for i in range(len(gas)):
if cost[i]>gas[i]:
continue
volume=0
for j in range(i,i+len(gas)):
if volume <0:
break
volume+=gas[i]
volume-=cost[i]
if j==i+len(gas)-1:
return i
return -1
class Solution:
def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:
gas=gas+gas
cost=cost+cost
for i in range(len(gas)):
if cost[i]>gas[i]:
continue
volume=0
for j in range(i,i+len(gas)):
volume+=gas[i]
volume-=cost[i]
if volume <0:
break
if j==i+len(gas)-1 and volume >=0:
return i
return -1
class Solution:
def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:
gas=gas+gas
cost=cost+cost
for i in range(len(gas)):
if cost[i]>gas[i]:
continue
volume=0
for j in range(i,i+len(gas)):
volume+=gas[i]
if volume>= cost[i]:
volume-=cost[i]
else:
volume-=cost[i]
break
if j==i+len(gas)-1 and volume >=0:
return i
return -1
gas =
[2,3,4]
cost =
[3,4,3]
输出
2
预期结果
-1
T3
听完视频思路,一遍过
本题的想法很重要,把问题拆分成两个子问题,对每个子问题用贪心策略求解
本题中每个位置的值其实有两个约束,也即要在满足规则的条件下使得左端点与右端点的值均大于等于1
举例来说
rating=[1,2,2,5,4,3,2]
5对应的值不能取3因为按照规则4对应的值要比3小,以此类推后四位对应的值为[3,2,1,0]末尾矛盾了
同理也要检查队首是否满足条件,此时5对应的值取3是可以的[1,2,1,3]
这样就把问题拆成了左右两个子问题
class Solution:
def candy(self, ratings: List[int]) -> int:
nums=[1]*len(ratings)
nums2=[1]*len(ratings)
for i in range(1,len(ratings)):
if ratings[i]>ratings[i-1]:
nums[i]=nums[i-1]+1
j=len(nums)-2
while j>=0:
if ratings[j]>ratings[j+1]:
nums2[j]=nums2[j+1]+1
nums[j]=max(nums[j],nums2[j])
j-=1
nums[-1]=max(nums[-1],nums2[-1])
return sum(nums)