leetcode 3652(定长滑动窗口/前缀和)

3652: 按策略买卖股票的最佳时机

思路:定长滑动窗口 / 前缀和,枚举修改子数组 i−k,i−1

方法一:前缀和

计算两个前缀和数组:

  • 定义数组 c,其中 ci=pricesi⋅strategyi。计算 c 的前缀和,记作 sum
  • 计算 prices 的前缀和,记作 sum_sell

如果不修改,答案为 sumn。

复制代码
class Solution {
public:
    long long maxProfit(vector<int>& prices, vector<int>& strategy, int k) {
        int n=prices.size();
        vector<long long> sum(n+1),sum_sell(n+1);
        //前缀和
        for(int i=0;i<n;i++){
            sum[i+1]=sum[i]+prices[i]*strategy[i];
            sum_sell[i+1]=sum_sell[i]+prices[i];
        }
        long long ans=sum[n];
        for(int i=k;i<=n;i++){
            long long res=sum[i-k]+sum[n]-sum[i]+sum_sell[i]-sum_sell[i-k/2];
            ans=max(ans,res);
        }

        return ans;
    }
};

方法二:定长滑动窗口

设不修改时的利润为 total。修改后,++利润(相比不修改)++增加了 sum (可能<0)。所有窗口的 sum 的最大值为 maxSum。那么答案为 total+max(maxSum,0)。这里可能出现 maxSum<0 的情况,此时不修改更好,也就是与 0 取最大值。

对于价格 p,如果修改前策略是 x,修改后策略是 y,那么利润增加了 p⋅(y−x)。比如原来买入,现在持有(不买入),那么利润增加了 p⋅(0−(−1))=p。又比如原来买入,现在卖出,那么利润增加了 p⋅(1−(−1))=2p。

下面计算每个窗口的 sum,考察从 i−k,i−1 向右滑到 i−k+1,i,sum 如何变化。

复制代码
class Solution {
public:
    long long maxProfit(vector<int>& prices, vector<int>& strategy, int k) {
        long long total=0,sum=0,max_sum=0;
        for(int i=0;i<prices.size();i++){
            int p=prices[i],s=strategy[i];
            total+=p*s;
            //入右半,交易策略从s变成1
            sum+=p*(1-s);
            //2<= k <=prices.length,尚未形成第一个窗口
            if(i<k-1){
                if(i>=k/2-1) sum-=prices[i-k/2+1]; //形成初始窗口时的左半边元素
                continue;
            }
            //更新
            max_sum=max(max_sum,sum);
            //对于下一个窗口,下标为i-(k/2-1)的元素从右半移到左半,交易策略从 1 变成 0;下标为 i-k+1 的元素从左半离开窗口
            sum-=prices[i-k/2+1]-prices[i-k+1]*strategy[i-k+1];
        }

        return total+max_sum;
    }
};
相关推荐
强哥聊算力1 小时前
《算力江湖·英伟达传奇》第七集:ChatGPT出现前夜,英伟达发生了什么?
服务器·人工智能·算法·ai·chatgpt·gpu算力
Navigator_Z5 小时前
LeetCode //C - 1289. Minimum Falling Path Sum II
c语言·算法·leetcode
CCblandy5 小时前
令牌桶在 0.9 倍负载超发 19%、固定窗口边界放行 20 个:四种限流算法同构实测
后端·python·算法·性能优化·架构
mmmmath_36 小时前
LeetCode.104.二叉树的最大深度
数据结构·leetcode
YangYang9YangYan7 小时前
2027供应链计划校招:数学与应用数学专业如何把预测模型讲成业务决策?
人工智能·sql·算法
jsjzsl27 小时前
递归自改进系统(RSI)的本质是自发对称破缺:智能爆炸有界—— AI研发切记盲目投入
人工智能·python·算法
程序员清风7 小时前
最短路径算法:BFS、Dijkstra 与 Floyd
java·算法·宽度优先
梦帮科技7 小时前
Kali Linux Scapy 畸形报文构造学——深度解剖非法 TCP Flags 与反常序列号
linux·爬虫·神经网络·算法·数学建模·系统架构·模拟退火算法
171320330计算机毕设编程8 小时前
计算机毕业设计 基于YOLO改进算法的车辆特征识别系统设计与实现--lw
java·大数据·python·sql·算法