代码随想录第29天 | 121. 买卖股票的最佳时机 、 122.买卖股票的最佳时机II

一、前言

参考文献:代码随想录

今天的主题是买股票,其中有一个题目只是前用用贪心算法做过的,但是这次是用动态规划,这里的难点还是对与递推公式的推导,我们一起来看看吧!

二、买卖股票的最佳时机

1、思路:

本题我一开始的想法与题解想法沾了一点边,但是并完全对;

(1)dp数组的确定:

        vector<vector<int>> dp (prices.size(), vector<int>(2, 0));

这个表示在第i天的时候dp[i][0]持有股票的利润和dp[i][1]不持有股票的利润;

持有股票可以分为两种,当天买入了股票和之前就持有股票;

不持有股票也分为两种,当天卖出了股票和之前就没有持有股票;

(2)递推公式:

注意!这里只允许买卖一次股票!

所以递推公式就是dp[i][0] 就可以由dp[i - 1][0]或者-prices[i]花掉买股票的钱,(我最开始的时候写的是dp[i - 1][1] - proces[i]这里就变成了多次买卖股票了!)我们只需要在这两者之前找到最大利润即可;

dp[0][1]同理:

            dp[i][0] = max(-prices[i], dp[i - 1][0]);
            dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i]);

(3)遍历顺序:

观察递推公式可知是从前向后遍历;

(4)初始化:

只需要初始化前一个dp就行

2、整体代码如下:

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        // 与121的区别就是可以买卖多次
        // 1、创建dp数组
        vector<vector<int>> dp(prices.size(), vector<int>(2, 0));
        // 2、初始化
        // 买入股票
        dp[0][0] = -prices[0];
        // 不买
        dp[0][1] = 0;

        // 3、遍历顺序
        for (int i = 1; i < prices.size(); i++) {
            // 4、递推公式
            // 这里的主要区别就是可以去判断上一次是没买股票时的利润减去这次投资的本金
            dp[i][0] = max(dp[i - 1][1] - prices[i], dp[i - 1][0]);
            dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i]);
        }

        // 4、打印dp数组
        // for (auto i : dp) {
        //     for (auto j : i) {
        //         cout << j << " ";
        //     }
        //     cout << endl;
        // }
        return dp[prices.size() - 1][1];
    }
};

三、买卖股票的最佳时机

1、思路:

本题与121差不多,只有一个地方不一样:本题可以买卖多次,这就表明递推公式会发生变化;

也就是在持有股票的时候发生变化:

dp[i][0] = max(dp[i -1][0], dp[i - 1][1] - prices[i]),这里买股票的时候就需要与之前不只有股票的利润就行运算了,而之前没有持有股票的话,那就是利润为0,因为只允许买卖一次;

2、整体代码如下:

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        // 1、初始化dp数组
        // 在i天j = 0表示持有股表的利润dp[i][0],不持有股票的利润dp[i][1]
        vector<vector<int>> dp (prices.size(), vector<int>(2, 0));

        // 2、初始化
        dp[0][0] -= prices[0];
        dp[0][1] = 0;

        // 3、遍历顺序
        for (int i = 1; i < prices.size(); i++) {
            // 4、递推公式
            dp[i][0] = max(-prices[i], dp[i - 1][0]);
            dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i]);
        }

        // 5、打印dp数组
        // for (auto j : dp) {
        //     for (auto k : j) {
        //         cout << k << " ";
        //     }
        //     cout << endl;
        // }

        return dp[prices.size() - 1][1];

    }
};

Time to Study: 1h

leave message:

 A little kownledge is not a dangerous thing to one who does not mistake it for a great deal.

知识浅薄对一个人并不危险,只要他不误以为知识渊博。

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32通过ESP8266(MQTT)连接新版ONENET(2024/4/23)(保姆级教程)附运行结果

⏩ 大家好哇&#xff01;我是小光&#xff0c;想要成为系统架构师的嵌入式爱好者。 ⏩在各种嵌入式系统中我们经常会使用上位机去做显示&#xff0c;本文对STM32通过ESP8266连接最新版的ONENET做一个详细教程。 ⏩感谢你的阅读&#xff0c;不对的地方欢迎指正。 STM32通过ESP82…

【图说】VMware Ubuntu22.04 详细安装教程

前言 无论是从事 Linux 开发工作&#xff0c;还是希望电脑运行双系统&#xff0c;VMware 虚拟机都是我们日常工作不可或缺的工具。本章将会重点介绍 VMware 安装流程&#xff0c;以及在 VMware 上如何运行、使用 Ubuntu22.04 系统。 一、VMware 下载安装 1.1 VMware 官网下载…

如何查看西门子触摸屏的镜像版本?

如何查看西门子触摸屏的镜像版本? 当软件组态的设备版本和实际设备镜像之间版本不同时,那么在传输项目时就会出现兼容性冲突的提示。 镜像版本说明: 如何调整镜像版本(升级或降级)? 为了使用新功能以及提高面板的稳定性、可靠性和可用性,建议使用新的镜像版本。 一、 通…

目标检测算法是指什么?

一、目标检测算法是指什么&#xff1f; 目标检测算法是计算机视觉领域的一个重要分支&#xff0c;它旨在识别和定位图像中的目标对象。以下是目标检测算法的相关内容&#xff1a; 目标检测的核心问题&#xff1a;目标检测需要解决的两个核心问题是“目标是什么”和“目标在哪里…

【计算机网络】(三)物理层 - 通信基础

文章目录 【计算机网络】&#xff08;三&#xff09;物理层 - 通信基础前言3.1 物理层的基本概念3.2 数据通信的基础知识3.2.1 数据、信号、码元3.2.2 信源、信宿、信道3.2.3 编码、调制3.2.3.1 基带调制&#xff08;编码&#xff09;3.2.3.2 带通调制&#xff08;调制&#xf…

想搭建跨境电商网站?掌握这些源码关键点,助您轻松上线

随着全球化的发展和电子商务的兴盛&#xff0c;跨境电商已成为企业拓展国际市场的主要方式之一。然而&#xff0c;想要搭建一个成功的跨境电商网站并非易事&#xff0c;其中关键之一就是掌握跨境电商网站源码的要点。在本文中&#xff0c;我将为您深入探讨如何选择、优化和维护…

一个java项目中,如何使用sse协议,构造一个chatgpt的流式对话接口

前言 如何注册chatGPT&#xff0c;怎么和它交互&#xff0c;本文就不讲了&#xff1b;因为网上教程一大堆&#xff0c;而且你要使用的话&#xff0c;通常会再包一个算法服务&#xff0c;用来做一些数据训练和过滤处理之类的&#xff0c;业务服务基本不会直接与原生chatGPT交互。…

mysql-connector-java和spring-boot-starter-jdbc和mybatis-spring-boot-start

mysql-connector-java和spring-boot-starter-jdbc和mybatis-spring-boot-start JDBC是什么意思&#xff1f; JDBC是使用java语言操作mysql数据库的规范&#xff0c;java语言必须按照这个规范写才可以操作mysql数据库。 mysql-connector-java 在最开始的时候 程序中是不允许…

省级客运、货运量及周转量数据(1990-2022年)

1、数据介绍 客运量和货运量是衡量交通运输行业发展状况的重要指标&#xff0c;可以反映一个地区或国家的经济发展水平和人民生活水平。而周转量则是反映运输行业效率的指标&#xff0c;即货物或旅客被运输的总距离。 省级客运、货运量及周转量是衡量一个地区交通运输行业发展…

第⑮讲:Ceph集群管理与监控操作指南

文章目录 1.查看集群的状态信息2.动态的查看集群的状态信息3.查看集群的利用率4.查看OSD的资源利用率5.查看OSD的列表6.查看各组件的状态7.查看集群的仲裁信息8.查看/修改集群组件sock的配置参数 1.查看集群的状态信息 通过集群状态信息可以看到集群的健康状态、各个组件的运行…

uniapp app权限说明弹框2024.4.23更新

华为上架被拒绝 用uni-app开发的app&#xff0c;上架华为被拒&#xff0c;问题如下&#xff1a; 您的应用在运行时&#xff0c;未见向用户告知权限申请的目的&#xff0c;向用户索取&#xff08;电话、相机、存储&#xff09;等权限&#xff0c;不符合华为应用市场审核标准。…

Bingbong的回文路径

Here 利用回文串&#xff0c;从左往右与从右往左的hash值相同来判断从左往右&#xff0c;例&#xff1a;从右往左&#xff0c;例&#xff1a;由于在树上&#xff0c;考虑建两颗树&#xff0c;一颗根为最高位&#xff08;up&#xff09;&#xff0c;一棵根为最低位&#xff08;…

0 transformers入门,HuggingFace!

目录 1 了解 2 文本分类 1 了解 1 依赖安装 !pip install transformers -i https://pypi.tuna.tsinghua.edu.cn/simple some-package 2 了解transformers 能做什么 from transformers.pipelines import SUPPORTED_TASKS SUPPORTED_TASKS.items()2 文本分类 我没外网所以…

微信小程序 讯飞录音 点击按钮录音内容转文字

<page-meta page-style"{{ showPolish ? overflow: hidden; : }}" /> <view class"wrap"> <view class"header-tab" style"justify-content: {{typeList.length > 2 ? start : center}}"><view class&quo…

promise笔记

1.介绍 之前的异步编程都是回调函数&#xff08;数据库操作、ajax、定时器、fs读取文件 &#xff09; promise是es6异步编程新的解决方案&#xff0c;是一个构造函数 优点&#xff1a;支持链式调用&#xff0c;可以解决回调地狱&#xff0c;可以指定回调函数 2.使用 functio…

UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xd7

安装mamba时报错 检查报错原因&#xff1a; file -i ~/.bashrc file -i ~/.profile发现bashrc的编码不正确 对编码格式进行修改 iconv -f ISO-8859-1 -t UTF-8 ~/.bashrc > ~/.bashrc.utf8 mv ~/.bashrc.utf8 ~/.bashrc cp ~/.bashrc ~/.bashrc.backup执行完指令之后再安…

SAM5916B 法国追梦DREAM 音频DSP芯片

法国追梦/DERAM SAM5504/5704/5716/5808音频DSP芯片,开发板&#xff0c;方案 可用于电子鼓、电子琴、电吉他、效果器、均衡器、啸叫抑制器等电声产品领域 一、全系列芯片&#xff1a; SAM2634 SAM2695 SAM5504B SAM5704B SAM5708B SAM5808B SAM5716B SAM5916B... 二、原厂开发套…

在matplotlib中控制colorbar的长度

在matplotlib中控制colorbar的长度 使用matplotlib绘制带颜色的箭头图&#xff0c;有时想直接把颜色条拿来当比例尺条&#xff0c;就需要控制颜色条的长度。 1. pyplot.colorbar()参数说明 pyplot.colorbar(mappable, ax, cax, **kwargs) mappable是一个ScalarMappble类型的…

【黑马头条】-day12项目部署和发布-jenkins

文章目录 1 持续集成2 软件开发模式2.1 瀑布模式2.2 敏捷开发2.2.1 迭代开发2.2.2 增量开发 3 Jenkins3.1 Jenkins安装3.1.1 导入镜像3.1.2 配置3.1.3 初始化设置 3.2 插件安装3.3 服务器环境准备3.3.1 Docker安装配置3.3.2 Git安装配置3.3.3 Maven安装配置 3.4 Jenkins工具配置…

YoloV8改进策略:卷积改进|DOConv轻量卷积,即插即用|适用各种场景

摘要 本文使用DOConv卷积&#xff0c;替换YoloV8的常规卷积&#xff0c;轻量高效&#xff0c;即插即用&#xff01;改进方法非常简单。 DO-Conv&#xff08;Depthwise Over-parameterized Convolutional Layer&#xff09;是一种深度过参数化的卷积层&#xff0c;用于提高卷…