C++ 买卖股票问题

news2024/11/17 8:56:32

目录

买卖股票的最佳时机

买卖股票的最佳时机III

 买卖股票的最佳时机 IV

买卖股票的最佳时机 II

买卖股票的最佳时机含手续费

买卖股票的最佳时机含冷冻期


买卖股票的最佳时机

121. 买卖股票的最佳时机

buy:手上有股票的最大收益

sell:手上没有股票的最大收益

i:到第  i   天时候的最大收益

j:完成了第  j  次交易时候的最大收益

 

解释:图中的  -∞  是  INT_MIN >> 1

buy[i] = max(昨天的持有时最大收益,昨天空手时最大收益)

sell[i] = max(昨天空手时最大收益,昨天持有时最大收益  +  当天可以出售获得的价格)

理解:对 i j 的理解最重要,完成0 比交易,那么buy只能买一次,后序一定是前面某次价格最便宜的,sell 0 比交易 那就都是0

对于buy完成一笔交易的第一天和第二天来说一定是 取不到的(那就初始化成-INT_MAX,右移一位,此题在buy[1][1]时候越界)因为你第一天买的要到第二天才可以卖,第三天才能重新买入

对于sell完成一笔交易也就是第二天才能有值

重点:如果对sell和buy都初始化为0,不然会在第一次交易出现问题,导致后序不对,在buy[1][1] 0元就可以手上持有股票,对应于sell来说直接就可以当天卖掉

参考代码

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n = prices.size();
        vector<vector<int>> buy(n, vector<int>(2, INT_MIN >> 1)), sell(n, vector<int>(2, INT_MIN >> 1));
        buy[0][0] = -prices[0];
        sell[0][0] = 0;
        for(int i = 1; i < n; i++)
        {
            for(int j = 0; j < 2; j++)
            {
                buy[i][j] = max(buy[i - 1][j], sell[i - 1][j] - prices[i]);
                sell[i][j] = sell[i - 1][j];
                if(j == 1)
                    sell[i][j] = max(sell[i][j], buy[i - 1][j - 1] + prices[i]);
            }
        }

        return max(sell[n - 1][0], sell[n - 1][1]);
    }
};

买卖股票的最佳时机III

123. 买卖股票的最佳时机 III

和上题一样buy[4][2] 第5天才有值,前面4天,两买两卖

参考代码

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n = prices.size();
        // vector<vector<int>> buy(n, vector<int>(3)), sell(n, vector<int>(3));
        vector<vector<int>> buy(n, vector<int>(3, INT_MIN >> 1));
        auto sell = buy;
        buy[0][0] = -prices[0], sell[0][0] = 0;
        for(int i = 1; i < n; i++)
        {
            for(int j = 0; j < 3; j++)
            {
                buy[i][j] = max(buy[i - 1][j], sell[i - 1][j] - prices[i]);
                // sell[i][j] = max(sell[i - 1][j], buy[i - 1][j - 1] + prices[i]);
                sell[i][j] = sell[i - 1][j];
                if(j > 0)
                    sell[i][j] = max(sell[i][j], buy[i - 1][j - 1] + prices[i]);
            }
        }
        return max(sell[n - 1][0], max(sell[n - 1][1], sell[n - 1][2]));
    }
};

 买卖股票的最佳时机 IV

188. 买卖股票的最佳时机 IV

参考代码

class Solution {
public:
    int maxProfit(int k, vector<int>& prices) {
        int n = prices.size();
        // vector<vector<int>> buy(n, vector<int>(3)), sell(n, vector<int>(3));
        vector<vector<int>> buy(n, vector<int>(k + 1, INT_MIN >> 1));
        auto sell = buy;
        buy[0][0] = -prices[0], sell[0][0] = 0;
        for(int i = 1; i < n; i++)
        {
            for(int j = 0; j <= k; j++)
            {
                buy[i][j] = max(buy[i - 1][j], sell[i - 1][j] - prices[i]);
                // sell[i][j] = max(sell[i - 1][j], buy[i - 1][j - 1] + prices[i]);
                sell[i][j] = sell[i - 1][j];
                if(j > 0)
                    sell[i][j] = max(sell[i][j], buy[i - 1][j - 1] + prices[i]);
            }
        }
        int ret = 0;
        for(int i = 0; i <= k; i++)
            ret = max(ret, sell[n - 1][i]);
        return ret;
    }
};

买卖股票的最佳时机 II

122. 买卖股票的最佳时机 II

区别于上三题,就是无限次数,对于无限次数的体现就是sell[i - 1] - prices[i]buy[i - 1] + prices[i]

只能手持一个股票的体现:buy[0] = -prices[0]buy[i - 1]

参考代码

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n = prices.size();
        vector<int> buy(n), sell(n);
        buy[0] = - prices[0];
        for(int i = 1; i < n; i++)
        {
            buy[i] = max(buy[i - 1], sell[i - 1] - prices[i]);
            sell[i] = max(sell[i - 1], buy[i - 1] + prices[i]);
        }
        return sell[n - 1];
    }
};

买卖股票的最佳时机含手续费

714. 买卖股票的最佳时机含手续费

重点:对于fee的位置

fee一定不能在buy[i - 1] 或 sell[i - 1]后面,因为这两个表示的是一个状态,不是购买或者卖出的一个点

在购买时减掉fee:sell[i - 1] - prices[i] - 2,刚开始我只改了这里,很奇怪为什么过不了?通过样例发现结果就多了一个fee,

那我想着在返回的时候减掉就行,但是这时候又会返回负数

那么再改返回值:sell[n - 1] - fee >= 0 ? sell[n - 1] - fee : 0;

结果出现了不用多减fee???

之后我终于发现了是因为buy[0]的原因,在买入的时候就要减掉fee第一次并没有减,

难点:能过的样例是因为没有用到prices[0],相同的prices不同的fee也会导致结果异常,下面的代码,发现取不到1,是比较的(-2 ,-3)了实际应该是比较(-4, -3) 这就是问题所在

参考代码1

class Solution {
public:
    int maxProfit(vector<int>& prices, int fee) {
        int n = prices.size();
        vector<int> buy(n), sell(n);
        buy[0] = -prices[0];
        for(int i = 1; i < n; i++)
        {
            buy[i] = max(buy[i - 1], sell[i - 1] - prices[i]);
            sell[i] = max(sell[i - 1], buy[i - 1] + prices[i] - fee);
        }
        return sell[n - 1];
    }
};

参考代码2

class Solution {
public:
    int maxProfit(vector<int>& prices, int fee) {
        int n = prices.size();
        vector<int> buy(n), sell(n);
        buy[0] = -prices[0] - fee;
        for(int i = 1; i < n; i++)
        {
            buy[i] = max(buy[i - 1], sell[i - 1] - prices[i] - fee);
            sell[i] = max(sell[i - 1], buy[i - 1] + prices[i]);
        }
        return sell[n - 1];
    }
};

买卖股票的最佳时机含冷冻期

309. 买卖股票的最佳时机含冷冻期

通过freeze[i - 1]来隔一天冷冻期为 1 天

参考代码

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n = prices.size();
        vector<int> buy(n), sell(n), freeze(n);
        buy[0] = -prices[0];
        for(int i = 1; i < n; i++)
        {
            buy[i] = max(buy[i - 1], sell[i - 1] - prices[i]);
            sell[i] = max(sell[i - 1], freeze[i - 1]);
            freeze[i] = buy[i - 1] + prices[i];
        }
        return max(sell[n - 1], freeze[n - 1]);
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1506498.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

蓝桥杯备战刷题five(自用)

1.数字三角形&#xff08;方向次数限制&#xff0c;动态规划&#xff09; //如果n为奇数时&#xff0c;最后必然走到最后行最中间的数&#xff0c;如果为偶数&#xff0c;则取中间两个数的最大值&#xff0c; //因为向左下走的次数与向右下走的次数相差不能超过 1 #include …

图腾柱PFC工作原理:一张图

视屏链接&#xff1a; PFC工作原理

centos7中python3.10找不到openssl解决方案

如果有用其他方法安装了其他版本openssl&#xff0c;记得卸载其他的openssl&#xff0c;删除其他的openssl相关文件。 yum remove openssl* rm -rf ***下载最新版的openssl文件 按照官网安装方法安装openssl 官方安装地址https://docs.python.org/3/using/unix.html#on-linu…

智慧城市与智慧乡村:共创城乡一体化新局面

一、引言 随着科技的不断进步和城乡发展的日益融合&#xff0c;智慧城市与智慧乡村的建设已成为推动城乡一体化发展的新引擎。智慧城市利用物联网、大数据、云计算等先进技术&#xff0c;实现城市治理、公共服务、产业发展等领域的智能化&#xff1b;而智慧乡村则借助现代科技…

中国电子学会2021年9月份青少年软件编程Sc ratch图形化等级考试试卷四级真题

【 单选题 】 1.下面哪个选项程序可以交换下图列表中第2项和第3项的位置&#xff1f; A&#xff1a; B&#xff1a; C&#xff1a; D&#xff1a; 2.雷峰塔景区的门票价格政策是&#xff1a;成人40元/人&#xff1b;6周岁&#xff08;含6周岁&#xff09;以下的实行免票&#…

【AI视野·今日NLP 自然语言处理论文速览 第八十三期】Wed, 6 Mar 2024

AI视野今日CS.NLP 自然语言处理论文速览 Wed, 6 Mar 2024 Totally 74 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers MAGID: An Automated Pipeline for Generating Synthetic Multi-modal Datasets Authors Hossein Aboutalebi, …

springboot260火锅店管理系统

火锅店管理系统设计与实现 摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装火锅店管理系统软件来发挥其高效…

ESP8266开发板 + DHT11+远程开关+ThingsCloud+APP+QQ邮件推送告警

ESP32 是乐鑫公司推出的 WiFi 芯片&#xff0c;它不仅支持 WiFi 和 BLE&#xff0c;还可以作为可编程的 MCU&#xff0c;通过 Espressif IDF、Arduino 等框架编写固件&#xff0c;用于非常广泛的物联网场景。 这个教程我们分享如何在 Arduino IDE 中使用 ThingsCloud ESP SDK&…

MIT6.828LAB4 (3)

LAB3_Part B: Copy-on-Write Fork 文章目录 LAB3_Part B: Copy-on-Write Fork前言练习8练习9练习10练习11练习12总结 前言 记录一下自己的学习过程 实验内容翻译&#xff1a; https://gitee.com/cherrydance/mit6.828 该翻译仅供参考 练习8 实现sys_env_set_pgfault_upcall系统…

10-ARM gicv3/gicv4的总结-基础篇

目录 1、gic的版本2、GICv3/gicv4的模型图3、gic中断号的划分4、GIC连接方式5、gic的状态6、gic框架7、gic Configuring推荐 本文转自 周贺贺&#xff0c;baron&#xff0c;代码改变世界ctw&#xff0c;Arm精选&#xff0c; armv8/armv9&#xff0c;trustzone/tee&#xff0c;s…

LeetCode刷题日志-17.电话号码的字母组合

纯暴力解法&#xff0c;digits有多长&#xff0c;就循环多少次进行字母组合 class Solution {public List<String> letterCombinations(String digits) {List<String> reslut new ArrayList<>();if(digits.equals(""))return reslut;Map<Inte…

C语言程序与设计——函数(二)递归练习

在上一篇文章中接触到了递归这种编程方法&#xff0c;下面我们将用几个程序加深以下对递归的理解。 递归实际上就是程序调用自身的编程技巧 递归程序的组成&#xff1a; 边界条件处理针对于问题的处理过程和递归过程结果返回 二分查找 首先分析二分查找的查找逻辑&#xff1a; …

操作系统笔记(进程)

注&#xff1a; 下面图片资源来源于 王道计算机考研 操作系统 1.进程概念 进程&#xff08;process&#xff09;&#xff1a;是动态的&#xff0c;是程序的一次执行过程&#xff08;同一程序多次执行&#xff0c;会产生多个进程&#xff09;程序&#xff1a;是静态的&…

Linux:锁和线程同步的相关概念以及生产者消费者模型

文章目录 加锁的基本原则死锁死锁的概念死锁的条件 线程同步生产者消费者模型模型的理解 理解cp问题条件变量 本篇总结的是关于Linux中锁的相关概念以及生产者消费者模型 加锁的基本原则 加锁的基本原则&#xff1a;谁加锁谁解锁&#xff0c;不要把加锁和解锁这样的操作放在两…

Java线程池ThreadPoolExecutor源码阅读

文章目录 概述线程池提交任务流程线程池提交任务源码阅读 源码阅读属性字段工作线程worker 线程池方法runWorker(Worker w) 运行工作线程getTask() 获取任务tryTerminate() 尝试终止线程池interruptWorkers、interruptIdleWorkers 中断工作线程reject(Runnable command) 拒绝任…

数组名的理解,看这一篇就够了!!!

&#xff01;&#xff01;&#xff01;以下是会涉及到的知识的讲解&#xff1a; 一&#xff1a;数组名的理解&#xff1a; 数组名是数组首元素的地址&#xff0c;但是有2个例外&#xff1a; 1. sizeof(数组名)&#xff0c;这里的数组名表示整个数组&#xff0c;计算的是整个…

LeetCode59:螺旋矩阵Ⅱ

题目描述 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;[[1,2,3],[8,9,4],[7,6,5]] 代码 class Solution { public:vector…

查看pip当前关联python版本及位置

好久没用python了&#xff0c;把各种pip指向的环境忘光光啦&#xff0c;这里记录一下查看pip当前关联的python版本及位置的方法&#xff1a; pip -V结果&#xff1a; 我一般不用这个版本的python&#xff0c;去环境变量看了一下&#xff0c;原来是anaconda的Scripts自带pip&a…

Vue class和style绑定:动态美化你的组件

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

EB tersos 24.0.1 添加MCU模块失败

1、问题&#xff1a; 新建工程&#xff0c;添加MCU模块总是失败&#xff0c;错误信息如下&#xff1a; 2、解决方案 创建工程时只保留Resource模块&#xff0c;直接点击Finish&#xff0c;其他模块之后再添加 在工程创建成功后再单独添加需要的模块