文章目录
滑动窗口之可获得的最大点数
几张卡牌 排成一行,每张卡牌都有一个对应的点数。点数由整数数组 cardPoints 给出。
每次行动,你可以从行的开头或者末尾拿一张卡牌,最终你必须正好拿 k 张卡牌。
你的点数就是你拿到手中的所有卡牌的点数之和。
给你一个整数数组 cardPoints 和整数 k,请你返回可以获得的最大点数。
思路
输入:cardPoints = [1,2,3,4,5,6,1], k = 3
输出:12
解释:第一次行动,不管拿哪张牌,你的点数总是 1 。但是,先拿最右边的卡牌将会最大化你的可获得点数。最优策略是拿右边的三张牌,最终点数为 1 + 6 + 5 = 12 。
- 先看懂题:
1、要求从第一位或者最后一位出发,即结果要么开头k位,要么结尾k位
2、要求连续,所以如果正向解决,就是循环整; - 使用滑动窗口,就考虑到cardPoints 的长度 - K位,剩下的就是要滑动的窗口的大小,且结果不管是从头开始的K位最大还是从尾巴开始的K 位最大,取中间滑动窗口和最小的就可以。
代码实现
def maxScore(cardPoints: List[int], k: int) -> int:
res = []
length = len(cardPoints)
sum_val = sum(cardPoints)
i, j = 0, length-k
temp = sum(cardPoints[i:j])
while j <= length:
res.append(temp)
if i < length:
temp -= cardPoints[i]
if j < length:
temp += cardPoints[j]
i += 1
j += 1
return sum_val-min(res)