几张卡牌 排成一行,每张卡牌都有一个对应的点数。点数由整数数组 cardPoints 给出。

每次行动,你可以从行的开头或者末尾拿一张卡牌,最终你必须正好拿 k 张卡牌。

你的点数就是你拿到手中的所有卡牌的点数之和。

给你一个整数数组 cardPoints 和整数 k,请你返回可以获得的最大点数。

前缀和 LeetCode1423. 可获得的最大点数_数据结构

  • 1 <= cardPoints.length <= 10^5
  • 1 <= cardPoints[i] <= 10^4
  • 1 <= k <= cardPoints.length

 

假设前面拿i张,后面则拿k-i张。

如果正常写需要写两个for循环,分别求前面的点数和、后面的点数和。超时。

所以可用用前缀和和后缀和来预处理。

pre[i]表示第1~第i个数的和。

post[i]表示第i~第n个数的和。

所以 结果 = max pre[i] + post[ n-(k-i-1)]

class Solution {
public:
    int maxScore(vector<int>& cardPoints, int k) {
          int n = cardPoints.size();
          vector<int>pre(n+1,0);
          vector<int>post(n+2,0);
          for(int i=0;i<n;i++){
              pre[i+1]=pre[i]+cardPoints[i];
          }
          for(int i=n-1;i>=0;i--){
              post[i+1]=post[i+2]+cardPoints[i];
          }
          int res=0;
          for(int i=0;i<=k;i++){
              res=max(res,pre[i]+post[n-k+i+1]);
          }
          return res;
    }
};
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.