可获得的最大点数
问题:
几张卡牌 排成一行,每张卡牌都有一个对应的点数。点数由整数数组 cardPoints 给出。
每次行动,你可以从行的开头或者末尾拿一张卡牌,最终你必须正好拿 k 张卡牌。
你的点数就是你拿到手中的所有卡牌的点数之和。
给你一个整数数组 cardPoints 和整数 k,请你返回可以获得的最大点数。
思路:
- 由于拿牌的位置处在前后,所以剩下牌(数量是 len - k 张)都是连续的。
- 所以只需求出数组中连续元素和最小的片段。
- 再用总合减去则为可以获得的最大点数。
class Solution {
public:
int maxScore(const vector<int>& cardPoints, int& k) const {
auto len = cardPoints.size();
k = len - k;
auto sumk = 0;
auto temp = k;
while(temp-- > 0) sumk += cardPoints[temp];
auto tempsum = sumk;
for(auto i = k; i < len; ++i) {
sumk = sumk - cardPoints[i - k] + cardPoints[i];
tempsum = min(tempsum, sumk);
}
auto sum = 0;
while(len-- > 0) sum += cardPoints[len];
return sum - tempsum;
}
};