【剑指offer】43.买卖股票的最好时机(一)

总目录:

算法之旅导航目录

 

1.问题描述

假设你有一个数组prices,长度为n,其中prices[i]是股票在第i天的价格,请根据这个价格数组,返回买卖股票能获得的最大收益
1.你可以买入一次股票和卖出一次股票,并非每天都可以买入或卖出一次,总共只能买入和卖出一次,且买入必须在卖出的前面的某一天
2.如果不能获取到任何利润,请返回0
3.假设买入卖出均无手续费
数据范围: 0≤n≤10^5,0≤val≤10^4

要求:空间复杂度 O(1),时间复杂度 O(n)

 

2.问题分析

 1动态规划,根据第i天是否持有股票和第i-1天是否持有股票之间建立状态转移方程

想通之后,真的是太妙啦

2暴力迭代

两个for循环嵌套,寻找最大收益


3.代码实例

动态规划

 1 #include <algorithm>
 2 class Solution {
 3   public:
 4     /**
 5      *
 6      * @param prices int整型vector
 7      * @return int整型
 8      */
 9 
10     int maxProfit(vector<int>& prices) {
11         //数据长度
12         int dataSize = prices.size();
13         if (dataSize < 2) {
14             return 0;
15         }
16 
17         // dp[i][0] 下标为 i 这天结束的时候,不持股,手上拥有的现金数
18         // dp[i][1] 下标为 i 这天结束的时候,持股,手上拥有的现金数
19         int dp[dataSize][2];
20 
21         dp[0][0] = 0;//不持股则为0
22         dp[0][1] = -prices[0];//持股,则为花费的钱
23 
24         //从第二天开始遍历
25         //思想
26         //若今天不持股,则在昨天不持股和持股间取较大值
27         //dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] + prices[i]);
28         //若今天持股,则在昨天不持股和昨天持股间取较大值
29         //dp[i][1] = max(dp[i - 1][1], -prices[i]);
30         for (int i = 1; i < dataSize; i++) {
31             dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] + prices[i]); //第i天不持股
32             dp[i][1] = max(dp[i - 1][1], -prices[i]);//第i天持股
33         }
34 
35         return dp[dataSize - 1][0];
36     }
37 };
View Code

暴力迭代,略

posted @ 2022-11-19 21:46  啊原来是这样呀  阅读(31)  评论(0)    收藏  举报