1005、K次取反后最大数组和:
class Solution(object):
def largestSumAfterKNegations(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: int
"""
nums = sorted(nums, key=lambda x: abs(x), reverse=True)
for i in range(len(nums)):
if k == 0:
return sum(nums)
if nums[i] < 0:
nums[i] = -nums[i]
k -= 1
while k > 0:
nums[-1] = -nums[-1]
k -= 1
return sum(nums)
局部最优:先对绝对值最大的负数操作,如果全部负数操作完后k还不为0,对绝对值最小的非负数进行剩余次数的操作
本题分两次局部最优,先操作负数,负数操作完还没结束,再操作绝对值最小的非负数,思路巧妙
134、加油站:
class Solution(object):
def canCompleteCircuit(self, gas, cost):
"""
:type gas: List[int]
:type cost: List[int]
:rtype: int
"""
cur_sum, total_sum, start = 0, 0, 0
for i in range(len(gas)):
cur_sum += gas[i] - cost[i]
total_sum += gas[i] - cost[i]
if cur_sum < 0:
start = i + 1
cur_sum = 0
if total_sum < 0:
return -1
return start
局部最优:若当前区间的累计和curSum小于0,则当前区间不存在满足题意的起点,更新start为i+1, curSum更新为0,重新开始寻找起点
135、分发糖果:
class Solution(object):
def candy(self, ratings):
"""
:type ratings: List[int]
:rtype: int
"""
res = [1] * len(ratings)
for i in range(1, len(ratings)):
if ratings[i] > ratings[i-1]:
res[i] = res[i-1] + 1
for i in range(len(ratings)-1, 0, -1):
if ratings[i-1] > ratings[i]:
res[i-1] = max(res[i] + 1, res[i-1])
return sum(res)
本题分两次比较,一次是从左向右遍历,一次是从右向左遍历,遇到后面比前面的评分高,则改糖果数