LeetCode每日一题(2021-2-6 可获得的最大点数)
题目描述
几张卡牌 排成一行,每张卡牌都有一个对应的点数。点数由整数数组 cardPoints 给出。
每次行动,你可以从行的开头或者末尾拿一张卡牌,最终你必须正好拿 k 张卡牌。
你的点数就是你拿到手中的所有卡牌的点数之和。
给你一个整数数组 cardPoints 和整数 k,请你返回可以获得的最大点数。
解题思路
还能说什么呢,滑就完事了。只不过这里需要一点点技巧,由于只能从卡牌左右两端拿,所以剩下的卡牌(n - k张)必定是连续的。所以可以考虑求出滑动窗口大小为n - k时的最小值,最后用所有卡牌点数之和减去这个最小值即可得到答案。话不多说,上代码:
class Solution {
public int maxScore(int[] cardPoints, int k) {
int n = cardPoints.length;
int l = 0, r = n - k - 1; //双指针指向滑动窗口左右两端
int totalSum = 0; //所有卡牌点数之和
int sum = 0; //当前滑动窗口内卡牌点数之和
for(int i = 0; i < n; i++){
if(i <= r){
sum += cardPoints[i];
}
totalSum += cardPoints[i];
}
l++; //滑动窗口右移
r++;
int minSum = sum; //保存所有滑动窗口中最小的点数之和
while(r < n){
sum += cardPoints[r] - cardPoints[l - 1]; //更新点数之和
minSum = Math.min(minSum, sum);
l++;
r++;
}
return totalSum - minSum;
}
}