定长滑动窗口(LeetCode——1423.可获得的最大点数)
题目
. - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/maximum-points-you-can-obtain-from-cards
几张卡牌 排成一行,每张卡牌都有一个对应的点数。点数由整数数组 cardPoints
给出。
每次行动,你可以从行的开头或者末尾拿一张卡牌,最终你必须正好拿 k
张卡牌。
你的点数就是你拿到手中的所有卡牌的点数之和。
给你一个整数数组 cardPoints
和整数 k
,请你返回可以获得的最大点数。
题解
直接使用定长滑动窗口解决显然不行,虽然是给定的长度k,但是拿走卡牌是从两边拿走的不是在窗口中操作的。
我们可以用逆向思维,我们要拿走最大点数的卡牌虽然是从两边拿走的,那么我们留下来的卡牌就是和为最小点数的卡牌,我们的窗口也就是留下来的卡牌。并且值得注意是题目没有要求我们要从两边要拿取固定的牌数,也就是我们可以只从一边拿牌,这样我们的窗口就可以从头遍历到尾。
class Solution {
public int maxScore(int[] cardPoints, int k) {
int n=cardPoints.length;
int count = 0;
int sum = 0;
for (int i = 0; i < n - k; i++) {
sum += cardPoints[i];
count += cardPoints[i];
}
int ans = count;
for (int i = n - k; i < n; i++) {
sum += cardPoints[i];
count += cardPoints[i] - cardPoints[i - (n - k)];
ans = Math.min(ans, count);
}
return sum - ans;
}
}