LeetCode每日一题(2021-2-6 可获得的最大点数)

LeetCode每日一题(2021-2-6 可获得的最大点数)

题目描述

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

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

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

给你一个整数数组 cardPoints 和整数 k,请你返回可以获得的最大点数。
在这里插入图片描述

解题思路

  还能说什么呢,滑就完事了。只不过这里需要一点点技巧,由于只能从卡牌左右两端拿,所以剩下的卡牌(n - k张)必定是连续的。所以可以考虑求出滑动窗口大小为n - k时的最小值,最后用所有卡牌点数之和减去这个最小值即可得到答案。话不多说,上代码:

class Solution {
    
    
    public int maxScore(int[] cardPoints, int k) {
    
    
        int n = cardPoints.length;
        int l = 0, r = n - k - 1; //双指针指向滑动窗口左右两端
        int totalSum = 0; //所有卡牌点数之和
        int sum = 0; //当前滑动窗口内卡牌点数之和
        for(int i = 0; i < n; i++){
    
    
            if(i <= r){
    
    
                sum += cardPoints[i];
            }
            totalSum += cardPoints[i];
        }
        l++; //滑动窗口右移
        r++;
        int minSum = sum; //保存所有滑动窗口中最小的点数之和
        while(r < n){
    
    
            sum += cardPoints[r] - cardPoints[l - 1]; //更新点数之和
            minSum = Math.min(minSum, sum);
            l++;
            r++;
        }
        return totalSum - minSum;
    }
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/GGG_Yu/article/details/113715969