【剑指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 };
暴力迭代,略
 
                    
                
 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号