买卖股票的最佳时机—2:
题目:
用一个数组表示股票每天的价格,数组的第i个数表示股票在第i天的价格。
交易次数不限,但一次只能交易一支股票,也就是说手上最多只能持有一支股票,求最大收益。
你可以完成尽可能多的交易(多次买卖股票)。
然而, 你不能同时参与多个交易(你必须在再次购买前出售股票)。
解法:
贪心算法,买卖次数不限,问题就简单了,只要挣钱就卖出。
//示例代码 1
int maxProfit(int* prices, int pricesSize)
{
int min = 0, max = 0;
int i = 0, j = 0;
int sum = 0;
while (i < pricesSize - 1)
{
if (prices[i] < prices[i + 1])
{
min = i;
for (j = i + 1; j < pricesSize; j++)
{
if (j == (pricesSize - 1) || prices[j] > prices[j + 1])
{
max = j;
break;
}
}
sum += (prices[max] - prices[min]);
i = j + 1;
}
else
i++;
}
return sum;
}
//示例代码--2
int maxProfit(int* prices, int pricesSize) {
int min = INT_MAX;
int sum = 0;
for (int i = 0; i<pricesSize; i++) {
if (i>0 && prices[i]<prices[i - 1]) {
sum = sum + prices[i - 1] - min;
min = prices[i];
}
else if (i == pricesSize - 1) {
if (prices[i]>min)
sum = sum + prices[i] - min;
}
else if (prices[i]<min) {
min = prices[i];
}
}
return sum;
}
int maxProfit(int* prices, int pricesSize) { //贪心算法
int sum = 0;
int temp = prices[0]; //暂设变量为第一天股票值
for (int i = 1; i < pricesSize; i++)
{
if (temp<prices[i]) //如果挣钱
{
sum = sum + prices[i] - temp; //售出股票
if (prices[i]<prices[i + 1]) //当前天股票价钱少于下一天--可挣钱
{
temp = prices[i]; //改设变量为当前天
}
else //否则跳过改天,更改变量为下一天
{
i++;
temp = prices[i];
}
}
else
temp = prices[i]; //找到第一个挣钱的天
}
return sum;
}