解答
动态规划
#include <vector>
#include <algorithm>
using namespace std;
class Solution {
public:
int maxProfit(vector<int>& prices) {
int n = prices.size();
if(n<2) return 0;
vector<vector<int>> dp(n,vector<int>(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]);
//如果题目只允许交易一次,-prices[i]因为只有这样才能保证只买一次
//dp[i][1] = max(dp[i-1][1],-prices[i]);
}
return dp[n-1][0];
}
};
贪心
只要后一天比前一天的价格高,就记录上收益,贪心算法只能用于计算最大利润,计算的过程并不是实际的交易过程。
#include <vector>
#include <algorithm>
using namespace std;
class Solution {
public:
int maxProfit(vector<int>& prices) {
int n = prices.size(); //先获取数组的长度
if(n==0) return 0; //特殊处理
int result = 0;
for (int i = 0; i < n-1; i++)
{
//只要后一天比前一天的价格高,就记录上收益
if(prices[i+1]>prices[i]) result+=prices[i+1]-prices[i];
}
return result;
}
};