买卖股票的最佳时机
题目描述
假设有一个数组,它的第i个元素是一支给定的股票在第i天的价格。如果你最多只允许完成一次交易(例如,一次买卖股票),设计一个算法来找出最大利润。
样例
样例1
输入: [3, 2, 3, 1, 2]
输出: 1
说明:你可以在第三天买入,第四天卖出,利润是 2 - 1 = 1
样例2
输入: [1, 2, 3, 4, 5]
输出: 4
说明:你可以在第0天买入,第四天卖出,利润是 5 - 1 = 4
样例3
输入: [5, 4, 3, 2, 1]
输出: 0
说明:你可以不进行任何操作然后也得不到任何利润
代码
class Solution {
public:
/**
* @param prices: Given an integer array
* @return: Maximum profit
*/
int maxProfit(vector<int> &prices) {
// write your code here
int m = 1e9 + 7, res = 0;
int n = prices.size();
for(int i = 0;i < n;i++)
{
if(prices[i] - m > res)
res = prices[i] - m;
if(prices[i] < m) m = prices[i];
}
return res;
}
};
2 如果题目改成可以进行任意次买入卖出呢
class Solution {
public:
/**
* @param prices: Given an integer array
* @return: Maximum profit
*/
int maxProfit(vector<int> &prices) {
// write your code here
int n = prices.size();
int sum = 0;
for(int i = 1;i < n;i++)
{
if(prices[i] - prices[i - 1] > 0)
sum += prices[i] - prices[i - 1];
}
return sum;
}
};
若最多只能买卖两次呢
class Solution {
public:
int maxProfit(vector<int>& prices) {
int n = prices.size();
if (n == 0) {
return 0;
}
int dp[1000000][6];
for (int k = 1; k <= 5; k++) {
dp[0][k] = -1e9;
}
dp[0][1] = 0;
for (int i = 1; i <= n; i++) {
// 手中未持有股票
for (int j = 1; j <= 5; j += 2) {
// 前一天也未持有
dp[i][j] = dp[i - 1][j];
if (j > 1 && i > 1 && dp[i - 1][j - 1] != -1e9) {
// 前一天持有,今天卖了获利。
dp[i][j] =max(dp[i][j], dp[i - 1][j - 1] + prices[i - 1] - prices[i - 2]);
}
}
// 手中持有股票
for (int j = 2; j <= 5; j += 2) {
//前一天未持有,今天买进
dp[i][j] = dp[i - 1][j - 1];
if (i > 1 && dp[i - 1][j] != -1e9) {
// 前一天持有了,计算今天的利润
dp[i][j] = max(dp[i][j], dp[i - 1][j] + prices[i - 1] - prices[i - 2]);
}
}
}
int res = 0;
for (int j = 1; j <= 5; j += 2) {
res = max(res, dp[n][j]);
}
return res;
}
};

浙公网安备 33010602011771号