上次学到的,比较和赋值转为一步,没用上
for循环中,应该这么写propit = max(propit,*it - min);
min = min(min,*it);
关键字和变量名尽量别起一样的
for(price:prices) 啥时候C++支持这么写了!
class Solution {
public:
int maxProfit(vector<int>& prices) {
if(prices.empty()) return 0;
int min = prices[0];
int propit = 0;
for(vector<int>::iterator it = prices.begin(); it != prices.end(); it++){
if(*it - min > propit) propit = *it - min;
if(*it < min) min = *it;
}
return propit;
}
};
动态规划
class Solution {
public:
int maxProfit(vector<int>& prices) {
int n = prices.size();
vector<vector<int>> dp(n,vector<int>(2));
dp[0][0] = -prices[0];
dp[0][1] = 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 max(dp[n-1][0],dp[n-1][1]);
}
};
动态规划,注意边界条件的设定
class Solution {
public:
int maxProfit(vector<int>& prices) {
if(prices.empty()) return 0;
int n = prices.size();
vector<vector<int>> dp(n,vector<int>(4));
//状态划分
//0 买进一只股票
//1 卖出一只股票
//2 卖出一只股票 买进另一只
//3 卖出两只股票
dp[0][0] = - prices[0];
dp[0][2] = -20000000;
dp[0][3] = 0;
dp[0][1] = 0;
for(int i = 1; i < n; i++){
dp[i][0] = max(dp[i-1][0],-prices[i]);
dp[i][1] = max(dp[i-1][0] + prices[i],dp[i-1][1]);
dp[i][2] = max(dp[i-1][2], dp[i-1][1] - prices[i]);
dp[i][3] = max(dp[i-1][3],dp[i-1][2] + prices[i]);
}
return max(dp[n-1][0],max(dp[n-1][1],max(dp[n-1][2],dp[n-1][3])));
}
};
以下写法会栈溢出
class Solution {
public:
int maxProfit(int k, vector<int>& prices) {
if(prices.empty()) return 0;
if(k < 1 ) return 0;
int n = prices.size();
vector<vector<vector<int>>> dp(n,vector<vector<int>>(k+1));
for(int i = 0; i < n; i++){
for(int j = 0; j < k+1 ; j++){
dp[i][j].push_back(0);
dp[i][j].push_back(0);
}
}
//状态0 第k-1个买进 未卖出
//状态1 第k-1个卖出
for(int i = 0; i <= k; i++){
dp[0][i][0] = -prices[0];
dp[0][i][1] = 0;
}
for(int i = 1; i < n; i++){
dp[i][0][1] = 0;
dp[i][1][0] = max(dp[i-1][1][0], -prices[i]);
dp[i][1][1] = max(dp[i-1][1][1], dp[i-1][1][0] + prices[i]);
}
for(int i = 1; i < n ;i++){
for(int j = 2; j <= k ; j++){
dp[i][j][0] = max(dp[i-1][j][0], dp[i-1][j-1][1] - prices[i]);
dp[i][j][1] = max(dp[i-1][j][1], dp[i-1][j][0] + prices[i]);
}
}
int maxprofit = 0;
for(int i = 1; i <= k; i++){
maxprofit = max(maxprofit,dp[n-1][i][0]);
maxprofit = max(maxprofit,dp[n-1][i][1]);
}
return maxprofit;
}
};
class Solution {
public:
// 无限次交易(贪心算法)
int maxProfit_inf(vector<int>& prices)
{
int max_profit = 0;
for(int i = 0; i < prices.size() - 1; i++)
{
if(prices[i + 1] > prices[i])
// 只要上涨就进行买卖股票
max_profit += (prices[i + 1] - prices[i]);
}
return max_profit;
}
int maxProfit(int k, vector<int>& prices) {
int n = prices.size();
if(n <= 1 || k < 1)
return 0;
if(k > n/2)
// 无限次交易
return maxProfit_inf(prices);
// 第一维k个状态:k次交易
// 第二维2个状态:0(买入股票)、1(卖出股票)
int dp[k][2];
// 初始化
for(int i = 0; i < k; i++)
{
dp[i][0] = INT_MIN;
dp[i][1] = INT_MIN;
}
for(int price : prices)
{
dp[0][0] = max(dp[0][0], -price); // 第 1 次买
dp[0][1] = max(dp[0][1], dp[0][0] + price); // 第 1 次卖
for (int i = 1; i < k; i++)
{
dp[i][0] = max(dp[i][0], dp[i - 1][1] - price); // 第 i 次买
dp[i][1] = max(dp[i][1], dp[i][0] + price); // 第 i 次卖
}
}
return dp[k - 1][1];
}
};
class Solution {
public:
int maxProfit(vector<int>& prices) {
if (prices.size() == 0) return 0;
vector<vector<int>> dp (prices.size(),vector<int>(3));
dp[0][0] = -prices[0];
dp[0][1] = 0;
dp[0][2] = 0;
for(int i = 1; i < prices.size(); i++){
//买入且没有卖出
dp[i][0] = max(dp[i-1][0],dp[i-1][2]-prices[i]);
//在冷冻期
dp[i][1] = dp[i-1][0] + prices[i];
//不在冷冻期,可以买入
dp[i][2] = max(dp[i-1][1],dp[i-1][2]);
}
return max(dp[prices.size()-1][0],max(dp[prices.size()-1][1],dp[prices.size()-1][2]));
}
};
class Solution {
public:
int maxProfit(vector<int>& prices, int fee) {
int n = prices.size();
int dp[n][2];
dp[0][0] = - prices[0] - fee;
dp[0][1] = 0;
for(int i = 1; i < n; i++){
dp[i][0] = max(dp[i-1][0],dp[i-1][1] - prices[i] - fee);
dp[i][1] = max(dp[i-1][1],dp[i-1][0] + prices[i]);
}
return dp[n-1][1];
}
};