LeetCode 1423. 可获得的最大点数
滑动窗口经典例题,从首尾选择元素;
之前自己的想法是直接对比首尾元素,直接求和就行,但是存在误区;
例如以下序列:
1,2,100,99,5,1;
如果选取三个数字,会选择1,5,2三个数字,但是应该选取1,5,99;
当然可以采用递归dfs,但是会存在爆栈问题;
当然也可以采用记忆法剪枝,但是还是会存在超时问题;
对于该题,最简单的方法是转换一下,取最大的前后元素,最后必定保证中间序列是连续序列;
所以只需要保证length-k个中间序列,和最小就可以;
转化为滑动窗口下的最小和问题;
int maxScore(vector<int>& cardPoints, int k) {
int windowsize = cardPoints.size() - k;
int sum = 0;
int mi = 0;
int all_sum = 0;
for (int i = 0; i <cardPoints.size() ; i++) {
if(i<windowsize)
sum += cardPoints[i];
all_sum += cardPoints[i];
}
mi = sum;
for (int i = windowsize; i < cardPoints.size(); i++) {
sum += cardPoints[i] - cardPoints[i - windowsize];
mi = min(sum, mi);
}
return all_sum-mi;
}

浙公网安备 33010602011771号