这里附上原题链接:1423.最多可以获得的分数有点意思。window,我想我们一般都会优先考虑结果范围的window,但是这道题反了。你需要判断的结果是数组头部和尾部元素的最大和,不适合我们直接进行滑动窗口操作。所以这道题的思路就变成了逆??运算。既然不能直接滑动窗口,那么可以间接的来解决头尾元素的最大和。直接计算总和然后减去数组中间元素的最小和是对的吗?是左右两端的最大和吗?所以我们在编写代码时需要确定的几件事是:我们要绘制多大的窗口?已知我们要求前后k个数之和的最大值:数组的长度为n,窗口的大小为size,那么我们滑动窗口的大小为n-k(求解最小和n-k个数)。这个窗口应该从哪里开始绘制呢?因为数组是无序的,我们没有办法直接判断从哪一边开始。我们需要确定一个区间,相加的值最小。如何确定呢?从头开始,首先确定前n-k个数字的总和。假设我们的滑动窗口区间之和为sum,首先计算数组元素0下标到下标n-k-1的和。此时最小sum设置为minsum,minisum默认值与sum相同。现在我们只确认数组中前n-k个数的和,并不能保证这个和是最小的,所以要开始遍历判断。如何判断和过滤区间?现在我们的窗口大小已经确定为n-k了,剩下的工作就是滑动窗口,确定窗口中求和的最小值。所以我们将遍历数组的其余部分,即n-k到n。那么我们要做的就是:在窗口向右移动的同时,窗口大小是固定的,如果有新的数字加入到窗口中,那么我就得舍弃最左边的数字,这样才能保证我们的窗口大小保持不变。然后判断去掉最左边的数和最小和后新加的数和和的关系。如果它更小,它将旧的最小和替换为新的最小和。否则继续遍历。最终,我们离手术还有一步之遥。我们得到的是中间的最小和,而不是题目要求的两端的最大和。所以我们需要求出整个数组元素的和,然后减去中间最小的和,就是最后的结果。publicintmaxScore(int[]cardPoints,intk){intn=cardPoints.length;//确定数组的长度intsize=n-k;//确定滑动窗口区间intsum=0;//滑动窗口区间的总和for(inti=0;i
