1005.K次取反后最大化的数组和
思路:每次都找出最小的一个值 然后将其nums[i] -> -nums[i]。因为当这个数字为负数时,将其变为正数显然能够使得整个数组和增加最多,当这个数字为最小正数时,这样的变化也可以使得代价最小
class Solution:
def largestSumAfterKNegations(self, nums: List[int], k: int) -> int:
# 每次都找出最小的一个值 然后将其nums[i] -> -nums[i]
# 因为当这个数字为负数时,将其变为正数显然能够使得整个数组和增加最多
# 当这个数字为最小正数时,这样的变化也可以使得代价最小
for i in range(k):
nums.sort()
nums[0] = -nums[0]
res = 0
for num in nums:
res+=num
return res
时间复杂度应该是O (knlogn)
134.加油站
class Solution:
def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:
n = len(gas)
cur_sum = 0
min_sum = float('inf')
for i in range(n):
cur_sum += gas[i] - cost[i]
min_sum = min(min_sum,cur_sum)
# 若gas的总和小于cost的总和,则无论从哪里出发都是跑不了一圈的
if cur_sum < 0:return -1
# rest[i] = gas[i]-cost[i]为一天剩下的油,i从0开始计算累加到最后一站。
# 如果累加没有出现负数,说明从0出发,油就没有断过,那么0就是起点。
if min_sum >= 0:return 0
# 如果累加的最小值是负数,汽车就要从非0节点出发,从后向前,看哪个节点能把这个负数填平,能把这个负数填平的节点就是出发节点。
for j in range(n-1,0,-1):
min_sum+=gas[j] - cost[j]
if min_sum >= 0:
return j
return -1
135.分发糖果
错误代码
# 错误代码1
class Solution:
def candy(self, ratings: List[int]) -> int:
# 首先每个孩子都需要给分发一个糖果
ans = 0
n = len(ratings)
for i in range(1,n):
if ratings[i] != ratings[i-1]:
ans += 1
return ans + n
# 错误代码2
class Solution:
def candy(self, ratings: List[int]) -> int:
# 首先每个孩子都需要给分发一个糖果
ans = 0
n = len(ratings)
candynum = [1] * n
for i in range(1, n):
if ratings[i] > ratings[i-1] and candynum[i] <= candynum[i-1]:
candynum[i]+=1
elif ratings[i] < ratings[i-1] and candynum[i] >= candynum[i-1]:
candynum[i-1]+=1
return sum(candynum)
class Solution:
def candy(self, ratings: List[int]) -> int:
# 首先每个孩子都需要给分发一个糖果
n = len(ratings)
candynum = [1] * n
# 从左往右 遍历比较大小
for i in range(n-1):
# 若相邻后一个数字更大 那后一个孩子就要比前一个孩子多一个糖果
if ratings[i+1] > ratings[i]:
candynum[i+1] = candynum[i]+1
# 从右往左 遍历比较大小
for i in range(n-1,0,-1):
if ratings[i-1] >ratings[i]:
# 若相邻前一个数字更大 那么前一个孩子就要比后一个孩子多一个糖果
# 取左右遍历得到的最大数 即满足左右循环且最小糖果数
candynum[i-1] = max(candynum[i-1],candynum[i]+1)
return sum(candynum)