【cpp算法】买卖股票的最佳时机(122)

cpp买卖股票

  • 前言
  • 题目
    • 示例 1:
    • 示例 2:
    • 示例 3:
    • 题目分析:
  • 代码及思路
    • 简单版
    • 动态规划版

前言

今天继续跟着小浩老师学习算法,由易到难,感觉越来越有意思啦。今天学习算法中的经典问题,股票的买卖。我所用的是非常简单的思路,后续学习了动态规划的思想,其实大二的时候学算法分析与设计这门课的时候就似懂非懂很多东西妹学明白,今天做的这道动态规划的题,我感觉不难而且还蛮有意思的。

题目

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。注意你不能在买入股票前卖出股票。

示例 1:

输入: [7,1,5,3,6,4]
输出: 7

解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
​ 随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。

示例 2:

输入: [1,2,3,4,5]
输出: 4

解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。

​ 注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。

​ 因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。

示例 3:

输入: [7,6,4,3,1]
输出: 0

解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。

题目分析:

首先我们看一下题目中给出的两个条件:

1、不能参与多笔交易。换句话讲,我们只能在手上没有股票的时候买入,也就是必须在再次购买前出售掉之前的股票。像我们平时买股票时的追涨杀跌是不可以的。

2、尽可能地多进行交易。这个非常好理解。像是黄金,一年基本上都有2-3次涨跌。我们只要把握住机会,在每一次涨跌的时候,低价卖入高价卖出,就可以使利益达到最大化。这个条件也是相当重要的,如果我们把这里变成,最多完成两笔交易,就变成另一道题。
更多的分析请点击小浩算法----买卖股票的最佳时期 题解分析

代码及思路

简单版

其实最开始我自己的思路挺简单的,能实现这个功能。

我的思路就是:
从第一个元素开始,如果这个元素的后一天的价格大于当前天的价格,那么就卖出去积攒利润,否则就继续遍历,直到倒数第二个元素(这里如果到最后一个会有内存泄漏的问题)
挺简单的对叭哈哈哈哈真的好简单!

值得注意的是,在cpp里面我们使用vector可以在初始化的时候不指定大小,但是需要注意格式。我太爱vector了呵呵

#include<iostream>
#include<vector>
using namespace std;
int main() {cout << "请输入总天数:" << endl;int amountDays;cin >> amountDays;int priceDay;//指定一个空的vectorvector<int> stockPriceArray;//先输入股票的价格for (int i = 0; i < amountDays; i++) {cin >> priceDay;stockPriceArray.push_back(priceDay);}//初始化总利润价格为0元int amountPrice=0;//如果遇到第二天比第一天高,那么就买了在卖,这就是最大的利润for (int i = 0; i < amountDays-1; i++) {if (stockPriceArray[i] < stockPriceArray[i + 1]) {amountPrice = amountPrice + stockPriceArray[i + 1] - stockPriceArray[i];}}cout << amountPrice << endl;return 0;
}

动态规划版

动态规划的思想其实最核心的是,我当前的状态的值和我的上一个状态是息息相关的,所以我们需要考虑两个问题:

  1. 我的初始值是什么?
  2. 前一个状态和后一个状态之间的联系怎么确立?

废话不多说,由于我们最后要求的是利润,而且每一天我们都可以选择抛售or保留股票,这样下来每天的不同状态下的利润都是不一样的。

  • 如果我在第i天我的手上有股票,那么我当天的利润值应该分为两个部分:①我前一天有股票,今天没卖出去 (利润:等于前一天有股票的利润)② 我前一天没有股票,今天买进来了(前一天没有股票的利润 - 今天的股票价格
  • 如果我在第i天手上没有股票,那么当天的利润值也应该有两种情况。①我前一天就没有股票(利润,和前一天没有股票一样) ② 我前一天有股票,今天卖了(利润应该等于前一天有股票的利润 + 今天股票的价格
    有没有人觉得这个东西好像神经网络的结构😂因此,我们可以用二维数组来解决上面这个问题。
  • 需要设置初始值,很容易知道 [0][0]位置是第一天不拥有股票,则利润是0,那[0][1]则是第一天拥有股票,利润是-price[1]
#include<iostream>
#include<vector>
using namespace std;
int main() {cout << "请输入总天数:" << endl;int amountDays;cin >> amountDays;int priceDay;//指定一个空的vectorvector<int> stockPriceArray;//先输入股票的价格for (int i = 0; i < amountDays; i++) {cin >> priceDay;stockPriceArray.push_back(priceDay);}//设置一个二维数组,对于vector用嵌套来设置,行是第一个形参,列是第二个形参vector<vector<int>> dp(stockPriceArray.size(), vector<int>(2));//初始化dp[0][0] = 0;dp[0][1] = -stockPriceArray[0];for (int i = 1; i < amountDays; i++) {dp[i][0] = max(dp[i - 1][0], dp[i-1][1] + stockPriceArray[i]);dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] - stockPriceArray[i]);}cout <<  dp[amountDays-1][0] << endl;return 0;}

好好加油,要学会努力地提升自己coding的能力,把技术学好,加油加油!!

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

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

相关文章

开源版中文和越南语贷款源码贷款平台下载 小额贷款系统 贷款源码运营版

后台 代理 前端均为vue源码&#xff0c;前端有中文和越南语 前端ui黄色大气&#xff0c;逻辑操作简单&#xff0c;注册可对接国际短信&#xff0c;可不对接 用户注册进去填写资料&#xff0c;后台审批&#xff0c;审批状态可自定义修改文字显示 源码免费下载地址抄笔记 (chaob…

常见面试算法题-数组二叉数

■ 题目描述 【数组二叉树】 二叉树也可以用数组来存储&#xff0c;给定一个数组&#xff0c;树的根节点的值存储在下标1&#xff0c;对于存储在下标N的节点&#xff0c;它的左子节点和右子节点分别存储在下标2*N和2*N1&#xff0c;并且我们用值-1代表一个节点为空。 给定一…

编程入门(三)【GPT工具的使用】

读者大大们好呀&#xff01;&#xff01;!☀️☀️☀️ &#x1f525; 欢迎来到我的博客 &#x1f440;期待大大的关注哦❗️❗️❗️ &#x1f680;欢迎收看我的主页文章➡️寻至善的主页 文章目录 前言背景了解GPT工具使用技巧GPT工具在学习和工作中的应用 前言 背景了解 2…

Linux——操作系统与进程基本概念

Linux——操作系统与进程基本概念 文章目录 Linux——操作系统与进程基本概念一、冯诺依曼体系结构二、操作系统2.1 OS层次图2.2 操作系统的作用2.3 管理的理解 三、进程3.1 进程的概念3.2 描述进程—PCB3.3 PCB的内容3.3.1 查看进程3.3.2 标识符3.3.3 状态3.3.4 程序计数器3.3…

跨境电商干货:如何提升亚马逊店铺质量?

亚马逊作为全球最大的电子商务平台之一&#xff0c;吸引了无数卖家和买家参与其中。在这个竞争激烈的环境中&#xff0c;要想提升亚马逊店铺的质量和业绩&#xff0c;需要采取一系列有效的策略和工具。而住宅IP代理作为一个强大的网络工具&#xff0c;也在其中发挥着重要的作用…

OpenCV基本图像处理操作(八)——光流估计

光流估计 光流估计是一种用于检测图像序列中像素点运动的技术。它基于这样的假设&#xff1a;在连续的视频帧之间&#xff0c;一个物体的移动会导致像素强度的连续性变化。通过分析这些变化&#xff0c;光流方法可以估计每个像素点的运动速度和方向。 光流估计通常用于多种应…

基于ssm冀中工程技师校园网站设计与实现论文

摘 要 使用旧方法对冀中工程技师学院网站的信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在冀中工程技师学院网站的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。这次…

测试大佬揭秘写好简历的7个细节

简历是HR对候选人的第一印象&#xff0c;一个有经验的HR初筛一份2页A4纸的简历通常只有几十秒的时间&#xff0c;如果没有看到自己想看的东西&#xff0c;哪怕简历再厚很可能会被直接pass掉。 如果有兴趣&#xff0c;再花一两分钟仔细浏览一下候选人的基本情况&#xff0c;研究…

最新最全的Jmeter接口测试必会技能:jmeter对图片验证码的处理

jmeter对图片验证码的处理 在web端的登录接口经常会有图片验证码的输入&#xff0c;而且每次登录时图片验证码都是随机的&#xff1b;当通过jmeter做接口登录的时候要对图片验证码进行识别出图片中的字段&#xff0c;然后再登录接口中使用&#xff1b; 通过jmeter对图片验证码…

【C语言】——字符串函数的使用与模拟实现(下)

【C语言】——字符串函数的使用与模拟实现&#xff08;下&#xff09; 前言五、长度受限类字符串函数5.1、 s t r n c p y strncpy strncpy 函数5.2、 s t r n c a t strncat strncat 函数5.3、 s t r n c m p strncmp strncmp 函数 六、 s t r s t r strstr strstr 函数6.1、函…

vue2知识点1 ———— (vue指令,vue的响应式基础)

vue2的知识点&#xff0c;更多前端知识在主页&#xff0c;还有其他知识会持续更新 Vue 指令 Vue指令是Vue.js中的一个重要概念&#xff0c;用于向DOM元素添加特定行为或功能。Vue指令以v-开头&#xff0c;例如v-bind、v-if、v-for等。 v-bind 动态绑定属性 用法&#xff1a…

跟bug较劲的第n天,undefined === undefined

前情提要 场景复现 看到这张图片&#xff0c;有的同学也许不知道这个冷知识&#xff0c;分享一下&#xff0c;是因为我在开发过程中踩到的坑&#xff0c;花了三小时排查出问题的原因在这&#xff0c;你们说值不值。。。 我分享下我是怎么碰到的这个问题&#xff0c;下面看代码…

资料总结分享:《全外显子测序数据的流程和原理》

1外显子与测序&#xff0c;生信流程 1.1 外显子是什么&#xff1f; 外显子是基因组中能够转录组出成熟RNA的部分。一个基因组中所有外显子的集合&#xff0c;即为外显子组。值得注意的是&#xff0c;通常所说的全外显子组测序&#xff0c;是指针对蛋白编码基因的外显子&#x…

【LeetCode热题100】【回溯】单词搜索

题目链接&#xff1a;79. 单词搜索 - 力扣&#xff08;LeetCode&#xff09; 要在一个二维数组里面找到一条单词路径&#xff0c;可以先遍历二维数组找到单词入口&#xff0c;然后往上下左右深度遍历&#xff0c;访问过的元素直接修改成字符串结束符&#xff0c;访问完改回去 …

PyTorch深度学习之旅:从入门到精通的十个关键步骤

在人工智能的浪潮中&#xff0c;深度学习框架扮演着至关重要的角色。PyTorch作为其中的佼佼者&#xff0c;以其简洁、直观和灵活的特性&#xff0c;吸引了众多开发者与研究者。本文将引导您逐步掌握PyTorch&#xff0c;从基础概念到高级应用&#xff0c;让您在深度学习的道路上…

Arduino UNO驱动MPR121接近电容式触摸传感器控制WS2812彩灯

简介 MPR121芯片功能强大可用作触摸,电容检测,驱动LED等等.在低速扫描下可以将功 耗降低到8μA,可以处理多达12个独立的触摸板。支持I2C,几乎可以用任何微控 制器连接。可以使用ADDR引脚选择4个地址中的一个,一个I2C2线总线上共有48 个电容触摸板。使用该芯片比使用模拟输入进行…

温度对射频电路性能的影响

对于射频电路,通常会有使用温度范围的要求,即在特定的温度范围内其性能变化不超出指标要求的值。对于工业级产品,一般要求使用温度范围为-40℃~+70℃,而军品要求使用温度范围为-55℃~+85℃。有一些其他特殊使用场景的产品会有不同的要求。 不同的温度对电路性能的影响,…

Shell学习 - 2.27 Linux bc命令:一款数学计算器

Bash Shell 内置了对整数运算的支持&#xff0c;但是并不支持浮点运算&#xff0c;而 Linux bc 命令可以很方便的进行浮点运算&#xff0c;当然整数运算也不再话下。 bc是"Basic Calculator"的缩写。 bc 甚至可以称得上是一种编程语言了&#xff0c;它支持变量、数组…

软件设计:UML 模型图总结

1. 相关链接 参考教程&#xff1a; https://sparxsystems.com/resources/tutorials/ https://sparxsystems.com/enterprise_architect_user_guide/15.2/model_domains/whatisuml.html Unified Modeling Language (UML) description, UML diagram examples, tutorials and r…

单片机学习笔记——LED点阵

代码如下&#xff0c;注意管脚和扫描所用的hc595_write_data函数 #include "reg51.h"typedef unsigned int u16; //对系统默认数据类型进行重定义 typedef unsigned char u8;//定义74HC595控制管脚 sbit SRCLKP3^6; //移位寄存器时钟输入 sbit RCLKP3^5; //存储寄存…