2021-02-06 1423. 可获得的最大点数[滑动窗口]

1423. 可获得的最大点数

思路一:贪心(错误)

如果每次取前后最大的一个数字,则不一定最优秀。如[1,100,3,2] k=2,如果每次取前后最大的一个元素,则结果为3+2 = 5,但是实际结果是1+100=101

class Solution {
    public int maxScore(int[] cardPoints, int k) {
        int res = 0;
        int start = 0;
        int end = cardPoints.length-1;
        while(k>0){
            k--;
            if(cardPoints[start]>cardPoints[end])
                res+=cardPoints[start++];
            else
                res+=cardPoints[end--];
        }  
        return res;
    }
}

思路二:滑动窗口法

我们可以从结果上来考虑,我们最后的结果是A,B,C,其中 A ∪ C A\cup C AC一共有k个元素,我们希望它最大,又因为 A ∪ B ∪ C A\cup B\cup C ABC的和是一定的,所以我们实际上只要用总和减去B的和就可以得到A+C的和了。

class Solution {
    public int maxScore(int[] cardPoints, int k) {
        int res = 0; // 记录n-k个的元素的值
        int sum = 0;
        
        int n = cardPoints.length;
        for(int i = 0;i<n;i++){
            sum+=cardPoints[i];
            if(i<(n-k))
                res+=cardPoints[i]; // [0,n-k-1]
        }
        int ans = sum-res;
        // i 是区间的终止
        for(int i=n-k;i<cardPoints.length;i++){
            res = res+cardPoints[i]-cardPoints[i-n+k];
            ans = Math.max(ans,sum-res);
        }
        return ans;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值