题目链接:可获得的最大点数
题干解读:
现在有一副牌,你有k次抽牌机会,每次只能从这副牌的头或者尾抽取,每张牌都有自己的点数,你的点数就是你手上所有卡牌的点数之和,返回你可能拿到的最大点数。
思路分析:
我们一共只能在牌头和牌尾抽取两段连续的牌,且牌的长度加起来要等于k,同时我们也能发现我们抽牌的深度最多为k,所以我们只需要把最前面和最后面的k张牌拿出来,首位相接,用一个长度为k的滑动窗口进行滑动,记录其滑动过程中的最大值,即我们可以拿到的最大点数。
代码:
class Solution {
public:
int maxScore(vector<int>& cardPoints, int k) {
vector<int> available_points(2 * k);
int len = cardPoints.size() - 1;
for(int i = 0; i < k; ++ i){
available_points.push_back(cardPoints[k - i - 1]);
}
for(int i = 0; i < k; ++ i){
available_points.push_back(cardPoints[len - i]);
}
int max_point = 0;
int d_win = 0;
for(int i = 0; i < available_points.size(); ++ i){
if(i < k){
max_point += available_points[i];
d_win += available_points[i];
}else{
d_win = d_win + available_points[i] - available_points[i - k];
max_point = max_point > d_win ? max_point : d_win;
}
}
return max_point;
}
};