LeetCode 1423.可获得的最大点数

难度:中等。

将这个问题转换为查找n-k个数字,使得剩余数字之和最大。这样需要维持n-k大小的滑动窗口。

超时代码:

class Solution {
public:
    int maxScore(vector<int>& cardPoints, int k) {
        int n = cardPoints.size();
        int win = n - k;
        int left = 0, right = n - k - 1;
        int res = 0;
        while(right < n){
            int temp = 0;
            for(int i = 0; i < left; i++){
                temp += cardPoints[i];
            }
            for(int i = right + 1; i < n; i++){
                temp += cardPoints[i];
            }
            if(temp > res) res = temp;
            left++;
            right++;
        }

        return res;
    }
};

我傻了,每次从头开始算当前的值了,所以超时了。

正确代码:

class Solution {
public:
    int maxScore(vector<int>& cardPoints, int k) {
        int n = cardPoints.size();
        int win = n - k;
        int left = 0, right = n - k - 1;
        int temp = 0;
        for(int i = 0; i < left; i++){
            temp += cardPoints[i];
        }
        for(int i = right + 1; i < n; i++){
            temp += cardPoints[i];
        }
        int res = temp;
        while(true){
            left++;
            right++;
            if(right == n)break;
            temp += cardPoints[left - 1];
            temp -= cardPoints[right];
            if(temp > res) res = temp;
        }
        return res;
    }
};

在这里插入图片描述

你可能感兴趣的:(刷题)