Maximum Points You Can Obtain from Cards

medium array sliding window prefix sum

Problem

Given an array cardPoints and integer k, take exactly k cards from either end. Return the maximum total score. Equivalent to: minimize the sum of an (n − k)-length contiguous subarray in the middle, then subtract from the total.

InputcardPoints = [1,2,3,4,5,6,1], k = 3
Output12
Take 1, 6, 5 from the right side: 1+6+5 = 12.

def max_score(card_points, k):
    n = len(card_points)
    total = sum(card_points)
    win = n - k
    if win == 0: return total
    cur = sum(card_points[:win])
    mn = cur
    for i in range(win, n):
        cur += card_points[i] - card_points[i - win]
        if cur < mn: mn = cur
    return total - mn
function maxScore(cardPoints, k) {
  const n = cardPoints.length;
  let total = 0;
  for (const x of cardPoints) total += x;
  const win = n - k;
  if (win === 0) return total;
  let cur = 0;
  for (let i = 0; i < win; i++) cur += cardPoints[i];
  let mn = cur;
  for (let i = win; i < n; i++) {
    cur += cardPoints[i] - cardPoints[i - win];
    if (cur < mn) mn = cur;
  }
  return total - mn;
}
class Solution {
    public int maxScore(int[] cardPoints, int k) {
        int n = cardPoints.length, total = 0;
        for (int x : cardPoints) total += x;
        int win = n - k;
        if (win == 0) return total;
        int cur = 0;
        for (int i = 0; i < win; i++) cur += cardPoints[i];
        int mn = cur;
        for (int i = win; i < n; i++) {
            cur += cardPoints[i] - cardPoints[i - win];
            if (cur < mn) mn = cur;
        }
        return total - mn;
    }
}
int maxScore(vector<int>& cardPoints, int k) {
    int n = cardPoints.size(), total = 0;
    for (int x : cardPoints) total += x;
    int win = n - k;
    if (win == 0) return total;
    int cur = 0;
    for (int i = 0; i < win; i++) cur += cardPoints[i];
    int mn = cur;
    for (int i = win; i < n; i++) {
        cur += cardPoints[i] - cardPoints[i - win];
        if (cur < mn) mn = cur;
    }
    return total - mn;
}
Time: O(n) Space: O(1)