2023.12.3
Problem: 1423. 可获得的最大点数
思路
这道题从头取从尾取,取得都是连续区间,与其求前缀和加后缀和,不如我们接链成环,例如 [1, 2, 4]
接链成环为 [1, 2, 4, 1, 2]
,我们只需要求出 cardPoints[i]
到 cardPoints[i+k]
这个区间的和的最大值。
当然,题目特殊在于我们既然从头从尾取,那必然要包含头和尾,所以 i
的取值范围是 [cardPoints.size(), cardPoints.size()+k]
。
为了快速计算区间和,我们可以维护一个前缀和数组 prefix
。
解题方法
- 将
cardPoints
接链成环; - 求其前缀和数组
prefix
; - 求
prefix
在[cardPoints.size(), cardPoints.size()+k]
区间内prefix[i] - prefix[i-k]
的最大值
复杂度
时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( n ) O(n) O(n)
Code
class Solution {
public:
int maxScore(vector<int>& cardPoints, int k) {
int n = cardPoints.size();
int prefix[2*n+1];
int maxAns = 0;
for (int i=0; i<n; i++) {
cardPoints.push_back(cardPoints[i]);
}
for (int i=1; i<=2*n; i++) {
prefix[i] = prefix[i-1] + cardPoints[i-1];
}
for (int i=n; i<=n+k; i++) {
maxAns = max(maxAns, prefix[i]-prefix[i-k]);
}
return maxAns;
}
};