Every day a Leetcode
题目来源:122. 买卖股票的最佳时机 II
解法1:贪心
需要说明的是,贪心算法只能用于计算最大利润,计算的过程并不是实际的交易过程。
代码:
/*
* @lc app=leetcode.cn id=122 lang=cpp
*
* [122] 买卖股票的最佳时机 II
*/
// @lc code=start
class Solution
{
public:
int maxProfit(vector<int> &prices)
{
int ans = 0;
for (int i = 1; i < prices.size(); i++)
if (prices[i] - prices[i - 1] > 0)
ans += prices[i] - prices[i - 1];
return ans;
}
};
// @lc code=end
结果:
复杂度分析:
时间复杂度:O(n),其中 n 为数组的长度。我们只需要遍历一次数组即可。
空间复杂度:O(1)。
解法2:动态规划
考虑到「不能同时参与多笔交易」,因此每天交易结束后只可能存在手里有一支股票或者没有股票的状态。
代码:
class Solution
{
public:
int maxProfit(vector<int> &prices)
{
int n = prices.size();
int dp[n][2];
dp[0][0] = 0, dp[0][1] = -prices[0];
for (int i = 1; i < n; i++)
{
dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] + prices[i]);
dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] - prices[i]);
}
return dp[n - 1][0];
}
};
结果:
复杂度分析:
时间复杂度:O(n),其中 n 为数组 prices 的长度。一共有 2n 个状态,每次状态转移的时间复杂度为 O(1),因此时间复杂度为 O(2n) = O(n)。
空间复杂度:O(n),其中 n 为数组 prices 的长度。我们需要开辟 O(n) 空间存储动态规划中的所有状态。