uacs2024

导航

leetcode 1423. 可获得的最大点数

1423. 可获得的最大点数

首先,前 k 个数和后 k 个数 的 较大者并不是正确答案,比如  100   40   17   9   73   75,正确解是248。

其次,想到了前或者后拿了一个数之后,就是求剩下序列拿k-1个数,可以转换成子问题,所以想到了递归。但是k比较大的时候就超时了:

class Solution {
public:
    int maxScore_2(const vector<int>& cardPoints, const int& k, const int& left,const int& right){
        if(k == 0)  return 0;
        if(left == right)  return cardPoints[left];
        int sumLeft = cardPoints[left] + maxScore_2(cardPoints,k-1,left+1,right);
        int sumRight = cardPoints[right] + maxScore_2(cardPoints,k-1,left,right-1);
        return max(sumLeft,sumRight);
    }

    int maxScore(vector<int>& cardPoints, int k) {
        return maxScore_2(cardPoints,k,0,cardPoints.size()-1);
    }
};

 这道题解题的关键就是能不能联想到:不同的 k 次左右拿牌的过程  其实就相当于  长度为k的滑动窗口取最大值,窗口必须包含开头cardPoints[0]或者结尾cardPoints[size-1]

class Solution {
public:
    int maxScore(vector<int>& cardPoints, int k) {
        int size = cardPoints.size();
        int now = 0;
        for(int i = 0;i < k;i++)  now += cardPoints[i];
        int resMax = now;
        for(int i = 0;i < k;i++){
            now = now - cardPoints[k-1-i] + cardPoints[size-1-i];
            if(resMax < now)  resMax = now;
        }
        return resMax;
    }
};

 

posted on 2024-12-02 18:28  ᶜʸᵃⁿ  阅读(9)  评论(0)    收藏  举报