浅谈 可获得的最大点数 问题

可获得的最大点数

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

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

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

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

思路:

  1. 由于拿牌的位置处在前后,所以剩下牌(数量是 len - k 张)都是连续的。
  2. 所以只需求出数组中连续元素和最小的片段。
  3. 再用总合减去则为可以获得的最大点数。
class Solution {
public:
    int maxScore(const vector<int>& cardPoints, int& k) const {
        auto len = cardPoints.size();
        k = len - k;
        auto sumk = 0;
        auto temp = k;
        while(temp-- > 0) sumk += cardPoints[temp];
        auto tempsum = sumk;
        for(auto i = k; i < len; ++i) {
            sumk = sumk - cardPoints[i - k] + cardPoints[i];
            tempsum = min(tempsum, sumk);
        }
        auto sum = 0;
        while(len-- > 0) sum += cardPoints[len];
        return sum - tempsum;
    }
};
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值