几张卡牌 排成一行,每张卡牌都有一个对应的点数。点数由整数数组 cardPoints
给出。
每次行动,你可以从行的开头或者末尾拿一张卡牌,最终你必须正好拿 k
张卡牌。
你的点数就是你拿到手中的所有卡牌的点数之和。
给你一个整数数组 cardPoints
和整数 k
,请你返回可以获得的最大点数。
1 <= cardPoints.length <= 10^5
1 <= cardPoints[i] <= 10^4
1 <= k <= cardPoints.length
假设前面拿i张,后面则拿k-i张。
如果正常写需要写两个for循环,分别求前面的点数和、后面的点数和。超时。
所以可用用前缀和和后缀和来预处理。
pre[i]表示第1~第i个数的和。
post[i]表示第i~第n个数的和。
所以 结果 = max pre[i] + post[ n-(k-i-1)]
class Solution {
public:
int maxScore(vector<int>& cardPoints, int k) {
int n = cardPoints.size();
vector<int>pre(n+1,0);
vector<int>post(n+2,0);
for(int i=0;i<n;i++){
pre[i+1]=pre[i]+cardPoints[i];
}
for(int i=n-1;i>=0;i--){
post[i+1]=post[i+2]+cardPoints[i];
}
int res=0;
for(int i=0;i<=k;i++){
res=max(res,pre[i]+post[n-k+i+1]);
}
return res;
}
};