一笔交易
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。
注意:你不能在买入股票前卖出股票。
方法一:
int maxProfit(int* prices, int pricesSize)
{
if (NULL == prices || pricesSize <= 1) return 0;
//申请一个priceSize行两列的二维数组
int** dp = (int**)malloc(sizeof(int)*pricesSize);
for (int i = 0; i < pricesSize; ++i)
{
dp[i] = (int*)malloc(sizeof(int) * 2);
}
//初始化
dp[0][0] = prices[0];
dp[0][1] = 0;
for (int i = 1; i < pricesSize; ++i)
{
dp[i][0] = fmin(dp[i - 1][0], prices[i]);
dp[i][1] = fmax(dp[i - 1][1], prices[i] - dp[i][0]);
}
int res = dp[pricesSize - 1][1];//将结果赋值到res再返回
for (int i = 0; i < pricesSize; ++i)//释放内存
{
free(dp[i]);
}
return res;
}
注意:c语言中数组的大小不能用变量定义,所以上述代码中动态申请了一个二维数组。但是力扣上直接使用dp[pricesSize][2]来定义二维数组,编译可以通过,VS2017上则不能编译通过。
方法二:
int maxProfit(const vector<int>& vec)
{
int n = vec.size();
int minp = INT_MAX;
int maxp = 0;
for (int i = 0; i < n; ++i)
{
if (vec[i] < minp)
{
minp = vec[i];
}
else if ((vec[i] - minp) > maxp)
{
maxp = vec[i] - minp;
}
}
return maxp;
}
多笔交易
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
&emsps; 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
方法一:
int calu(const vector<int>& vec,int s)//多笔交易
{
if (s >= vec.size()) return 0;
int n = vec.size();
int max = 0;
for (int i = s; i < n; ++i)
{
int maxp = 0;
for (int j = i + 1; j < n; ++j)
{
if (vec[i] < vec[j])
{
int profit = calu(vec, j + 1) + vec[j] - vec[i];
if (profit > maxp)
{
maxp = profit;
}
}
}
if (maxp > max)
{
max = maxp;
}
}
return max;
}
int maxSumProfit(const vector<int>& vec)
{
return calu(vec, 0);
}
方法二:
int maxProfit(vector<int>& prices)
{
int n = prices.size();
int maxp=0;
for(int i=1;i<n;++i)
{
if(prices[i]>prices[i-1])
{
maxp+=(prices[i]-prices[i-1]);
}
}
return maxp;
}