Leetcode122. 买卖股票 状态机dp C++实现

news2024/11/24 1:43:01

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

问题:给你一个整数数组 prices ,其中 prices [ i ] 表示某支股票第 i 天的价格。

在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。返回你能获得的最大利润 。


算法1:递归搜索 + 保存计算结果 = 记忆化搜索

        每天可以有两种状态,持有股票或未持有股票,所对应的状态转移方程也不同,如下图。

        从后向前递归,递归边界是第 0 天时,第 0 天不可能持有股票,但是递归过程中,会出现第 0 天的状态是 hold(持有)的情况,所以我们把这种情况的返回值设置成 INT_MIN ,这样就不会影响最后的输出。

        递归入口是第 n 天时,由于第 n 天时未持有股票一定比持有股票利润大,所以递归入口状态设置成 false(未持有)。

代码:

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n = prices.size();
        vector<array<int,2>> memo(n,{-1,-1});
        auto dfs = [&](auto &&dfs,int i,bool hold){
            if(i < 0)   return hold ? INT_MIN : 0; // INT_MIN 是因为第0天不可能持有股票,此时我们return一个最小值来保证其他递归的正确性
            int& res = memo[i][hold];
            if(res != -1)   return res;// 之前被计算过了
            if(hold)    return res = max(dfs(dfs,i-1,true),dfs(dfs,i-1,false) - prices[i]); // 当天持有
            return res = max(dfs(dfs,i-1,false),dfs(dfs,i-1,true) + prices[i]); // 当天未持有
        };
        return dfs(dfs,n-1,false); // 递归入口
    }
};

算法2:1:1 翻译成递推

        创建二维数组 dp ,并给 dp [ 0 ] [ 1 ] 赋初始值 INT_MIN ,遍历,列出状态转移方程。

代码:

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

算法3:空间优化

        算法1算法2 可知,我们在使用 dp 数组时只用到了相邻的两个格子,所以为了节省空间,我们可以不使用数组,仅使用变量来存储数据。dp0 表示未持有股票的利润,dp1 表示当前持有股票的利润。

代码:

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int dp0 = 0,dp1 = INT_MIN;
        for(int p : prices){
            int new_dp0 = max(dp0,dp1 + p);
            dp1 = max(dp1,dp0 - p);
            dp0 = new_dp0;
        }
        return dp0;
    }
};

算法4:

遍历数组,与标记到的最低价进行比较,画一个折线图,将所有的上升(红色)线段加起来即可得到答案。

代码:

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

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

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

相关文章

AOC商用显示器赋能绿色教育,助推教育信息化发展

摘要&#xff1a;助推教育发展&#xff0c;打造健康教学&#xff01; 作为提高国家创新能力及综合素养的基础&#xff0c;教育水平的高低往往决定着人才培养的数量和质量&#xff0c;决定着国家科技发展水平的高低&#xff0c;甚至于决定着民族国家的成败兴衰。从长远规划来看…

跨平台数据库管理软件SQLynx

什么是 SQLynx &#xff1f; SQLynx 是一个原生基于 Web 的 SQL 编辑器&#xff0c;支持企业的桌面和 Web 数据库管理。它最初被称为 SQL Studio&#xff0c;后来改名为 SQLynx。SQLynx 支持所有流行的数据库&#xff0c;如 MySQL、MariaDB、PostgreSQL、SQLite、Hive、Impala、…

Java File类与字节输入输出流详解

File类&#xff1a; 1.首先创建一下file的对象&#xff1a; 里面可以写相对路径或者绝对路径 File file new File("CCC.java"); 也可以使用其他构造方法 //String path "D:\\ch06"; //String fileName "1.txt"; File file new File(path…

超声波自动气象站

超声波自动气象站的功能优势可以包括以下几个方面&#xff1a; 高精度测量&#xff1a;超声波自动气象站采用超声波技术进行测量&#xff0c;可以实现高精度的测量结果&#xff0c;能够准确地测量气温、湿度、风速、风向等气象参数。 高可靠性&#xff1a;超声波自动气象站采用…

Zynq(2)从Hello World熟悉Zynq开发流程

文章目录 1.开发工具介绍2.工程目录简介3.Zynq裸机开发流程4.Hello World实现4.1vivado开发部分4.2vitis开发部分 5.传送门 1.开发工具介绍 xilinx提供了一系列的开发环境帮助用户提高开发效率&#xff0c;构建了完整的软件生态。对于最新的versal系列芯片&#xff0c;还提供了…

避雷!这5本计算机工程SCIE期刊被标记为“On Hold”状态!

计算机领域的研究学者们注意了&#xff01;&#xff01;&#xff01;这五本期刊被科睿唯安标记为On Hold了&#xff01;&#xff01; 1-IEEE Transactions on Intelligent Vehicles 2-Soft Computing 3-Multimedia Tools and Applicaitons 4-Journal of Intelligent & …

安卓学习笔记-unity调用原生opencv的sdk

unity调用原生opencv的sdk 问题描述解决思路解决过程准备工作opencv安卓原生sdk找到人脸检测的代码&#xff0c;检测成功后发送消息给unityunity接收消息 遇到的问题问题一问题二问题三 如何解决遇到的问题问题一&#xff1a;opencvactivity遮挡unity的界面问题问题二&#xff…

OpenAI官宣ChatGPT用户破2亿,新模型比GPT-4强100倍!

在刚刚召开的“KDDI SUMMIT 2024”大会上&#xff0c;OpenAI日本首席执行官長崎忠雄表示&#xff0c;截止至今年8月底&#xff0c;ChatGPT的月活用户数量突破2亿大关&#xff0c;成为史上最快达到这一成就的软件产品。 同时&#xff0c;ChatGPT企业级用户也获得大幅度增长达到…

【企业设置】自定义域名/应用模式支持自定义背景

09/04 主要更新模块概览 自定义背景 签名上传 权限配置 其他更新 01 表单管理 1.1 【移动端子表单】适配权限组字段操作权限 说明&#xff1a; 移动端子表单适配权限组配置&#xff0c;在权限组中可配置控制子表单的可新增记录&#xff0c;可插入记录&#xff0c…

24年9月通信基础知识补充1

看文献过程中不断发现有太多不懂的基础知识&#xff0c;故长期更新这类blog不断补充在这过程中学到的知识。由于这些内容与我的研究方向并不一定强相关&#xff0c;故记录不会很深入请见谅。 【通信基础知识补充2】9月通信基础知识补充1 一、Zadoff-Chu 序列1.1 Zadoff-Chu 序列…

【区块链 + 基层治理】腾讯未来社区:区块链业主决策系统 | FISCO BCOS应用案例

腾讯未来社区是腾讯推出的智慧社区综合解决方案&#xff0c;致力于形成“互联网 社区”一站式解决方案&#xff0c;打造智慧社 区健康生态。为了解决物业管理领域的痛点&#xff0c;构建围绕居民、物业、政府和商业四个角色为核心的良好生态&#xff0c;以 信息平台及工具为纽…

如何与客户保持高度粘性?这个系统给您答案

客户粘性是企业成功的关键因素之一&#xff0c;企客宝企微版在打通获客、转化、运营全链路方面发挥着重要作用&#xff0c;实现客户粘性的提升。 前言 客户粘性是企业成功的关键因素之一。企业需要不断通过各种手段提升客户粘性&#xff0c;保持客户忠诚度和长期合作关系。企客…

OpenCV结构分析与形状描述符(13)拟合椭圆函数fitEllipseDirect()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 围绕一组2D点拟合一个椭圆。 该函数计算出一个椭圆&#xff0c;该椭圆拟合一组2D点。它返回一个内切于该椭圆的旋转矩形。使用了由[91]提出的直接…

STM32F407+CubeMx串口通信实验(学习记录)

一、环境 硬件&#xff1a;STM32F407ZGT6开发板 软件&#xff1a;STM32CubeMx、Keil5 MDK、串口调试助手 PS:前面实验部分的代码都是可以正常运行的&#xff0c;但是在学习过程中我也踩了很多坑&#xff08;包括一些未弄明白的&#xff09;&#xff0c;我会记录在问题总结部分…

物联网之ESP32控制GPIO输出点亮LED、闪烁LED灯

MENU 前言原理GPIO引脚LED 硬件电路设计软件设计1、点亮一颗LED2、闪烁的LED 前言 不论学习什么单片机&#xff0c;最简单的外设莫过于IO口的高低电平控制LED&#xff0c;本文介绍如何使用Arduino控制ESP32的GPIO输出。通过本文的学习&#xff0c;掌握一定的Arduino程序架构知识…

求求你们别再跟风考PMP了!这几类人才真正需要这本证书!

救命啊&#xff01;&#xff01;&#xff01;这几天刷某书&#xff0c;看到好多人在吐槽说考了PMP证书一点用都没有&#xff0c;每三年还得花个千把块钱去续证&#xff0c;劝大家都别考。 这可能是PMP身上最大的一口“黑锅”了。作为全球认可、含金量极高的项目管理资格认证&am…

AXI4主机测试

前面对AXI4协议进行了比较详细的分析&#xff0c;本篇文章将会写一个主机代码来实现AXI4协议的时序。 设计思路&#xff1a;本次设计的主要目的是验证AXI4_FULL总线的时序&#xff0c;并且提升对AXI4_FULL总线协议的理解&#xff0c;因此可以采用状态机来控制&#xff0c;先向…

孩子用的台灯哪个牌子好?挑选护眼台灯先了解护眼台灯十大排名

孩子们的日常生活中有高达80%的时间是在阅读、做作业或面对电脑屏幕中度过的&#xff0c;因此对良好照明的需求显得尤为严格和精确。一些家长可能认为&#xff0c;只要孩子使用的是纸质材料&#xff0c;不像电子产品那样对眼睛有害&#xff0c;使用普通的台灯照明就足够了&…

mysql快速定位cpu 占比过高的sql语句

mysql快速定位cpu 占比过高的sql语句 当MySQL数据库的CPU使用率异常升高时&#xff0c;定位导致问题的SQL语句可以通过以下步骤进行 1、使用top命令找出mysl进程中占用CPU靠前的线程 #找出mysql 的进程号 ps -ef | grep mysql#根据进程号&#xff0c;找出占用CPU靠前的线程号…

【QT】文件读写,文件对话框

一.QFile类 QFile提供了从文件中读取和写入数据的能力。 我们通常会将文件路径作为参数传给QFile的构造函数。不过也可以在创建好对象最后&#xff0c;使用setFileName()来修改。 QFile是QIODevice的子类&#xff0c;利用QFile可以对文件进行打开&#xff0c;读取&#xff0c…