problem:1423. 可获得的最大点数
思路:滑动窗口,可以把数组复制一次加到末尾,这样我们可以从[n-k,n+k-1]范围内找长度为k的滑动窗口的最大值。
Accode:
class Solution {
public:
int maxScore(vector<int>& cardPoints, int k) {
int origin_len = cardPoints.size();
cardPoints.insert(cardPoints.end(),cardPoints.begin(),cardPoints.end());
deque<int> deq;
int ans = 0;
long long sum = 0;
for(int i=origin_len-k;i<origin_len+k;i++){
if(deq.size() && i-deq.front()+1>k){
sum-=cardPoints[deq.front()];
deq.pop_front();
}
deq.push_back(i);
sum+=cardPoints[i];
if(deq.size()>=k) ans = max((long long)ans,sum);
}
return ans;
}
};
时间复杂度:$o(n)$
也可以用前缀和来做,或者逆向思维,求大小为n-k的滑动窗口的最小值,总和减去最小值即为答案。