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

 

posted @ 2021-02-06 16:51  暮云林凌  阅读(46)  评论(0编辑  收藏  举报