leetcode_1423 可获得的最大点数

news/2024/7/23 11:06:29 标签: leetcode, 算法, 职场和发展

1. 题意

给定一个数组,每次只能从头和尾进行选择。
选择k次当前头或者尾,问能取到的最大值。
可获得的最大点数

2. 题解

主要难点是意识到这是一个滑动窗口问题。

2.1 滑动窗口

令数组长度为 s z sz sz
s _ w ( p o s , k ) s\_w(pos, k) s_w(pos,k)为其实点为 p o s pos pos,长度为 k k k的滑窗。
则求解的问题为 m a x ( s u m ( s _ w ( i , k ) ) ) , ( s z − k ) ≤ i ≤ s z − 1   o r   i = 0 max(sum(s\_w(i, k))),(sz-k) \le i \le sz -1 \ or\ i=0 max(sum(s_w(i,k))),(szk)isz1 or i=0

  • 正向
    T i m e : O ( k ) , S p a c e : O ( 1 ) Time:O(k),Space: O(1) Time:O(k),Space:O(1)
class Solution {
public:
    int maxScore(vector<int>& cardPoints, int k) {
        
        int sz = cardPoints.size();

        
        int bpos = sz - k;
        int ans = 0;

        int sum = 0;

        for ( int i = sz - k; i < sz - 1; ++i)
            sum += cardPoints[i];


        for ( int i = bpos; i < sz; ++i) {
            int idx = (i + k - 1) % sz;
            sum += cardPoints[idx];
            ans = max(ans, sum);
            sum -= cardPoints[i];
        }

        sum = std::accumulate(cardPoints.begin(), cardPoints.begin() + k, 0);

        ans = max(sum, ans);

        return ans;
    }
};

直接求首尾的滑动窗口复杂点,由于数组固定则总和固定。
求最大的 S u m ( s _ w ( p o s , k ) ) Sum(s\_w(pos, k)) Sum(s_w(pos,k))可以转化为 求最小的 S u m ( s _ w ( p o w , s z − k ) ) Sum(s\_w(pow, sz -k)) Sum(s_w(pow,szk))
最后再用总和减去最小的 s z − k sz-k szk滑窗即可。

注意:由于是首尾滑窗,所以sz-k的滑窗不能出现首尾相连情况

  • 逆向
    T i m e : O ( n ) , S p a c e : O ( 1 ) Time:O(n),Space: O(1) Time:O(n),Space:O(1)
class Solution {
public:
    int maxScore(vector<int>& cardPoints, int k) {
        
        int sz = cardPoints.size();
        int m = sz - k;

        int win_sum = 0;
        int tot_sum = std::accumulate(cardPoints.begin(), cardPoints.end(), 0);

        if ( m == 0)
            return tot_sum;

        if ( m > 1) {
            win_sum = std::accumulate(
                cardPoints.begin(), cardPoints.begin() + m - 1,0
            );
        }

        int win_min = INT_MAX;
        for (int i = 0;i < sz - m + 1; ++i) {
            int idx = (i + m - 1) % sz;
            win_sum += cardPoints[idx];
            win_min = min(win_min, win_sum);
            win_sum -= cardPoints[i];
        }

        return tot_sum - win_min;
    }
};
2.2 前缀和与后缀和

由于最终的情况无非,在前缀中取 k 1 k_1 k1,在后缀中取 k 2 k_2 k2, k 1 + k 2 = k k_1 +k_2=k k1+k2=k
所以我们可以通过计算 P r e f i x ( i ) , 0 ≤ i ≤ k ; S u f f i x ( j ) , 0 ≤ j ≤ k Prefix(i), 0 \le i \le k;Suffix(j),0 \le j \le k Prefix(i),0ik;Suffix(j),0jk
求出每一种情况即: P r e f i x ( x ) + S u f f i x ( k − x ) Prefix(x)+Suffix(k-x) Prefix(x)+Suffix(kx)的值来判断大小。

  • 前后缀分解
    T i m e : O ( k ) , S p a c e : O ( k ) Time:O(k),Space: O(k) Time:O(k),Space:O(k)

注意:前后缀累加只累计k轮

class Solution {
public:
    int maxScore(vector<int>& cardPoints, int k) {
        
        vector<int> prefix;
        vector<int> suffix;
        int preSum = 0;
        int sufSum = 0;
        int sz = cardPoints.size();

        for ( int i = 0; i < k + 1;++i) {
            prefix.push_back(preSum);
            suffix.push_back(sufSum);

            if ( i != k) {
                preSum += cardPoints[i];
                sufSum += cardPoints[sz - 1 - i];
            }
        }

        int ans = 0;
        for ( int i = 0; i < k + 1; ++i) {
            ans = max(ans, prefix[i] + suffix[k  - i]);
        }

        return ans;
    }
};


http://www.niftyadmin.cn/n/5236778.html

相关文章

scikit-learn线性回归法进行利润预测

大家好&#xff0c;生成式人工智能无疑是一个改变游戏规则的技术&#xff0c;但对于大多数商业问题来说&#xff0c;回归和分类等传统的机器学习模型仍然是首选。 私募股权或风险投资这样的投资者利用机器学习&#xff0c;首先必须了解关注的数据以及它是如何被使用的。投资公…

kernel | 不想老是编译内核?sysfs和debugfs了解一下

编译内核是一件让大家都抗拒的事情&#xff0c;因为编译一次内核需要的时间成本比较漫长&#xff0c;而且如果每次代码的微小改动或者想要额外调用某一个函数执行某一个动作就要不断的编译内核的话&#xff0c;就相当于CPU大量的时间都用在了idle&#xff0c;开发效率将会是相当…

深度学习——第3章 Python程序设计语言(3.2 Python程序流程控制)

3.2 Python程序流程控制 目录 1.布尔数据类型及相关运算 2.顺序结构 3.选择&#xff08;分支&#xff09;结构 4.循环结构 无论是在机器学习还是深度学习中&#xff0c;Python已经成为主导性的编程语言。而且&#xff0c;现在许多主流的深度学习框架&#xff0c;例如PyTorc…

【23-24 秋学期】NNDL 作业10 BPTT

习题6-1P 推导RNN反向传播算法BPTT. 习题6-2 推导公式(6.40)和公式(6.41)中的梯度&#xff0e; 习题6-3 当使用公式(6.50)作为循环神经网络的状态更新公式时&#xff0c; 分析其可能存在梯度爆炸的原因并给出解决方法&#xff0e; 习题6-2P 设计简单RNN模型&#xff0c;分别…

【腾讯云HAI域探密】- AIGC应用助力企业降本增效之路

一、前言&#xff1a; 近年来&#xff0c;随着深度学习、大数据、人工智能、AI等技术领域的不断发展&#xff0c;机器学习是目前最火热的人工智能分支之一&#xff0c;是使用大量数据训练计算机程序&#xff0c;以实现智能决策、语音识别、图像处理等任务。 作者也是经过了以…

第四章 React之Typescript

一、专栏介绍 欢迎加入本专栏&#xff01;我将带领您从零开始快速掌握React&#xff0c;从搭建项目到深入理解React项目。后续还会将主流的Umi Max作为前端应用框架&#xff0c;并借助Ant Design Pro来设计用户界面。在这个专栏中&#xff0c;我将为您揭示开发过程中常见功能的…

【数据挖掘】国科大刘莹老师数据挖掘课程作业 —— 第一次作业

homewrok 1 1. 假定数据仓库中包含 4 个维&#xff1a;date, product, vendor, location&#xff1b;和两个度量&#xff1a;sales_volume 和 sales_cost。 (a) 画出该数据仓库的星形模式 图 1 星形模式图 (b) 由基本方体 [date, product, vendor, location] 开始&#x…

从马帮到金蝶云星空通过接口配置打通数据

从马帮到金蝶云星空通过接口配置打通数据 接入系统&#xff1a;马帮 上海马帮科技有限公司&#xff0c;是一家专注于提供全流程跨境电商ERP管理软件解决方案的企业。聚焦服务于各阶段、各领域的跨境电商从业者&#xff0c;旗下包含专业版ERP、亚马逊专用版ERP、东南亚海外版ERP…