目录

  • 问题描述
  • 示例:
  • 分析
  • 算法说明:
  • 本题使用“贪心算法”的流程
  • 代码
  • 输入输出
  • 程序流程图
  • 复杂度分析:

问题描述

假设你有一个数组,其中第i 个元素是第i天给定股票的价格。设计算法以找到最大利润。你可以根据需要完成尽可能多的交易(即,多次买入并卖出一股股票)。注意:你不能同时进行多笔交易(即,你必须在再次购买之前卖出股票)
要求给出测试案例,设计算法,并给出算法在你的测试案例上计算得到的结果。

示例:

示例 1:

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

示例 2:

输入: [1,2,3,4,5]
输出: 4
解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 =5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。
因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。

示例 3:

输入: [7,6,4,3,1]
输出: 0
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。

示例4:
输入: [1,2,3,4,5]
输出: 4
解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。
因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。

分析

“贪心算法” 在每一步总是做出在当前看来最好的选择。 因此, “贪心算法” 和 “动态规划”、“回溯搜索” 算法一样,完成一件事情,是分步决策的; “贪心算法” 在每一步总是做出在当前看来最好的选择,我是这样理解 “最好” 这两个字的意思:
“最好” 的意思往往根据题目而来,可能是 “最小”,也可能是 “最大”;

贪心算法和动态规划相比,它既不看前面(也就是说它不需要从前面的状态转移过来),也不看后面(无后效性,后面的选择不会对前面的选择有影响),因此贪心算法时间复杂度一般是线性的,空间复杂度是常数级别的。

这道题 “贪心” 的地方在于,对于 “今天的股价 - 昨天的股价”,得到的结果有 3 种可能:(1)正数(2)0(3)负数。

贪心算法的决策是:只加正数

算法说明:

1、该算法仅可以用于计算,但计算的过程并不是真正交易的过程,但可以用贪心算法计算题目要求的最大利润。下面说明这个等价性:以 [1, 2,
3, 4] 为例,这 4 天的股价依次上升,按照贪心算法,得到的最大利润是: = (prices[3] - prices[2]) +
(prices[2] - prices[1]) + (prices[1] - prices[0])
= prices[3] - prices[0] 仔细观察上面的式子,按照贪心算法,在索引为 1、2、3 的这三天,我们做的操作应该是买进昨天的,卖出今天的,虽然这种操作题目并不允许,但是它等价于:“在索引为 0 的那一天买入,在索引为 3
的那一天卖出”。

本题使用“贪心算法”的流程

这道题使用贪心算法的流程是这样的:
从第 i 天(这里 i >= 1)开始,与第 i - 1 的股价进行比较,如果股价有上升(严格上升),就将升高的股价( prices[i] - prices[i- 1] )记入总利润,按照这种算法,得到的结果就是符合题意的最大利润。

代码

#include<bits/stdc++.h>   //超级万能头文件
//#include<stdio.h>
//#include <iostream>
//#include<vector>
using namespace std;
class Solution {public:int maxProfit(vector<int>& prices) {   int ans = 0;int n = prices.size();for (int i = 1; i < n; ++i) {ans += max(0, prices[i] - prices[i - 1]);}return ans;}
};int main(){Solution s;vector<int> prices;/*prices.push_back(7); prices.push_back(1);prices.push_back(5);prices.push_back(3); prices.push_back(6); prices.push_back(4);*/int k;int a[k];cout<<"请输入 ""股票"" 的价格个数:";cin>>k;cout<<"请分别输入"<<k<<"个股票价格并回车:";for(int i=0;i<k;i++){//prices.push_back(a[k]);cin>>a[i];  }for(int i=0;i<k;i++){prices.push_back(a[i]);//cin>>a[i];   }double result = s.maxProfit(prices);cout<<"最大利润为:"<<result;return 0;
}

输入输出

示例(1)

示例(2)
示例(3)

程序流程图

复杂度分析:

时间复杂度:O(n),其中 n为数组的长度。只需要遍历一次数组即可。

空间复杂度:O(1),只需要常数空间存放若干变量。

【贪心算法之“买卖股票问题”——C++实现 (附源代码及运行截图)】相关推荐

  1. _28LeetCode代码随想录算法训练营第二十八天-贪心算法 | 122.买卖股票的最佳时机II 、55.跳跃游戏、45.跳跃游戏II

    _28LeetCode代码随想录算法训练营第二十八天-贪心算法 | 122.买卖股票的最佳时机II .55.跳跃游戏.45.跳跃游戏II 题目列表 122.买卖股票的最佳时机II 55.跳跃游戏 45 ...

  2. 代码随想录算法训练营第三十二天_第八章_贪心算法 | 122.买卖股票的最佳时机II、55. 跳跃游戏、45.跳跃游戏II

    LeetCode 122.买卖股票的最佳时机II 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格.设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票 ...

  3. 贪心算法之买卖股票的最佳时机 II

    给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票). 注意:你不能同时参与多笔交易(你必须在再次 ...

  4. 算法学习--买卖股票的最佳时机

    题目如下: 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票). 注意:你不能同时参与多笔交易( ...

  5. 【每日一算法】买卖股票的最佳时机

    微信改版,加星标不迷路! 每日一算法-买卖股票的最佳时机 作者:阿广 阅读目录 1 题目 2 解析 1 题目 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 如果你最多只允许完成一笔 ...

  6. leetcode算法题-- 买卖股票的最佳时机

    原题链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/ 这类股票题目请见leetcode算法题–最佳买卖股票时机含 ...

  7. leetcode算法题--买卖股票的最佳时机 II

    原题链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-ii/ 这类股票题目请见leetcode算法题–最佳买卖股票 ...

  8. leetcode算法题--买卖股票的最佳时机含手续费

    原题链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/ 这类股票题目请见 ...

  9. 小白学算法:买卖股票的最佳时机!

    作者 | 王磊 来源 | Java中文社群(ID:javacn666) 转载请联系授权(微信ID:GG_Stone) 本文已收录至 Github<小白学算法>系列:https://gith ...

最新文章

  1. [Issue Fixed]-执行脚本时出现invalid option错误
  2. 攻击面管理(ASM),企业攻击面管理实践指南
  3. java立方表示方法
  4. LiveVideoStackCon深圳-网络的研究够搞个几辈子
  5. 求n的阶乘的算法框图_算法|从阶乘计算看递归算法
  6. java枚举类型转换为Struts2的select的数据
  7. wpfbutton按钮禁用_wpfbutton按钮禁用_如何在WPF窗口中隐藏关闭按钮?
  8. 给Repeater、Datalist和Datagrid增加自动编号
  9. Git学习笔记之廖雪峰Git教程
  10. 饿了么ui自定义表头内容
  11. 日本的美景,从谷歌卫星地图上就可以一撇究竟
  12. 本地的手机号码归属地查询-oracle数据
  13. 51单片机八段数码c语言程序,51单片机做的音乐盒,带八段数码管显示程序+Proteus仿真...
  14. 传奇服务器赞助文件夹,传奇服务端每个文件夹的含义
  15. 熟知四种常见的BIOS信息说明【7gyy】
  16. 六足机器人的步态分析与实现——1
  17. 【王道考研】操作系统 笔记 第一章
  18. 宽带和网线有什么区别?
  19. 【数据库与SQL】力扣刷题SQL篇(7)
  20. mysql约束简单理解

热门文章

  1. 每个初恋女子都是相似的
  2. SQL大厂春招真题,独家详细解析
  3. Default Boot Device Missing or Boot Failed解决方法
  4. 挑战绕口令《化肥会挥发》从初入江湖到天外飞仙的不同说法
  5. 2018年上海米其林指南--榜单
  6. Django 序列化和反序列化(九)
  7. Linux限制cpu睿频限制频率
  8. Java实现FTP批量大文件上传下载
  9. 蓝桥杯13-20届真题答案和解析(Java 大学 B 组)2013年省赛真题3_振兴中华
  10. 【华为机试真题详解】欢乐的周末