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; }