可获得的最大点数

这道题可以从逆向思维的角度来解
先分析题目:
- 题目要求每次只能从第一个或者最后一个位置取元素,这意味着剩余数组元素是连续的
- 题目要求取出的点数总和为最大,意味着数组中剩余连续点数和为最小
- 综合起来可以将题目理解为:求题目剩余子数组的点数最小和
数组长度:int cardPoints = n,取得得点数个数:int k,那么剩余点数数目int m = n-k
题目要求最小值,那么初始化最小值应该设置成最大值int min = Integer.MAX_VALUE;
我们也可以先计算第一个窗口的总和sum,将其作为最小值int min = sum,这样就不需要设最小值int min = Integer.MAX_VALUE;
由于题目条件为
- 每个 cardPoints [i] ≤ 10⁴
- 数组长度 n ≤ 10⁵
最大总和 = 10⁵ × 10⁴ = 10⁹
10 亿 < 21 亿,所以 int 完全装得下
因此这道题我们不需要使用long类型
Java代码实现如下:
class Solution {
public int maxScore(int[] cardPoints, int k) {
int total = 0;
int n = cardPoints.length;
for (int x : cardPoints) total += x;
int m = n-k;
int sum = 0;
for(int i = 0;i<m;i++){
sum += cardPoints[i];
}
int min = sum;
for(int i = m;i<n;i++){
sum+=cardPoints[i]-cardPoints[i-m];
min = Math.min(min,sum);
}
return total-min;
}
}
浙公网安备 33010602011771号