可获得的最大点数

image

这道题可以从逆向思维的角度来解

先分析题目:

  1. 题目要求每次只能从第一个或者最后一个位置取元素,这意味着剩余数组元素是连续的
  2. 题目要求取出的点数总和为最大,意味着数组中剩余连续点数和为最小
  3. 综合起来可以将题目理解为:求题目剩余子数组的点数最小和

数组长度: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;
    }
}
posted @ 2026-05-28 11:00  ZealousMclaren  阅读(7)  评论(0)    收藏  举报