给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。
注意你不能在买入股票前卖出股票。
示例 1:
输入: [7,1,5,3,6,4] 输出: 5 解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。 注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。
示例 2:
输入: [7,6,4,3,1] 输出: 0 解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。
暴力搜索
class Solution {
public:
int maxProfit(vector<int>& prices) {
int value=0;
int n=prices.size();
if(n==0||n==1)
return 0;
for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++)
value=max(prices[j]-prices[i],value);
return value;
}
};
极小-极大思想
class Solution {
public:
int maxProfit(vector<int>& prices) {
int value=0;
int n=prices.size();
if(n==0||n==1)
return 0;
int low=prices[0];//思想:极小-极大值
for(int i=1;i<n;i++)
if(prices[i]-low<0)
low=prices[i];
else
value=max(value,prices[i]-low);
return value;
}
};
二维数组动态规划
class Solution {
public:
int maxProfit(vector<int>& prices) {
int n=prices.size();
vector<vector<int>>dp(n+1,vector<int>(2,0));
dp[0][0]=0;
dp[0][1]=INT_MIN;
for(int i=1;i<=n;i++)
{
dp[i][0]=max(dp[i-1][0],dp[i-1][1]+prices[i-1]);
dp[i][1]=max(dp[i-1][1],-prices[i-1]);
}
return dp[n][0];
}
};
利用滚动数组简化空间
class Solution {
public:
int maxProfit(vector<int>& prices) {
int n=prices.size();
vector<int>dp(2,0);
dp[0]=0;
dp[1]=INT_MIN;
for(int i=1;i<=n;i++)
{
dp[0]=max(dp[0],dp[1]+prices[i-1]);
dp[1]=max(dp[1],-prices[i-1]);
}
return dp[0];
}
};