Leetcode探究初级算法题目:买卖股票的最佳时机 II

题目如下:给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
示例 1:
输入: [7,1,5,3,6,4]
输出: 7
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。

我刚开始看到这一题,觉得并不复杂,觉得只要找到一对一对的低价,高价,然后算每对价格的利润。
如果输入为prices=[7,1,5,3,6,4],则首先买入1,然后卖出5,盈利4;再次买入3,卖出6,盈利3;总利润是7。这并没有值得讨论的特殊情况。后来我想到了另一个输入数组:prices=[7,1,5,6,10,4],如果用这个作为输入的话,则需要取最低价为1,最高价为10,然后一次性买入卖出,这样利润就是9;两个数组到底是选择一次性买入卖出还是分两次买入卖出,最重要的区别就是第一次卖出的价格是否高于第二次买入的价格,这是边界条件。同时作为输入prices=[7,1,5,6,10,4],我们一开始会搜寻到买入7,卖出10的方式,但是这时候利润只有3,显然不是我们想要的方式,必须要规避。考虑以上几个问题后,我给出我的方案如下:
#include
#include"vector"
using namespace std;
class Solution {
public:
int maxProfit(vector& prices) {
int Profit_Sum = 0;
int next_price_in = 0;
int next_price_out = 0;
int price_out = 0;
int price_in = 0;
bool price_in_change = false; //最低价格是否改变
for (int i = 0; i < prices.size(); i++)
{
for (int j = i+1; j < prices.size(); j++)
{
if (prices[i] < prices[j])
{
//先记录卖出的价格
price_in = prices[i];
price_out = prices[j];
cout << “目前买入价格为:” << price_in << " ;" << “卖出价格为:” << price_out << endl;
//辨别买入价格是否是卖出之前的最低价
int temp_i = i;
int temp_j = j;
for(int lowest_aim= temp_j -1; lowest_aim> temp_i; lowest_aim–)
{
if (prices[lowest_aim] < price_in)
{
price_in_change = true;
cout << “买入的价格并非是最低价” << price_in << endl;
price_in = prices[lowest_aim];
cout << “找到更便宜的买入价格:” << price_in << endl;
}
i = lowest_aim - 1; //由于跳出循环后i自动加1,所以这里先减1;
}
if (price_in_change == true)
{
cout << “最终选定买入价格为:” << price_in << endl;
j = i + 1;
price_in_change = false;
cout << “跳出循环,重新寻找卖出价格” << endl;
break;
}
int k = 0;
//寻找下次买入卖出的价格
//如果下次买入的价格高于这次卖出价格,比如prices=[7,1,5,6,10,4];
//第一次买入1,卖出4,获利4;第二次买入6,卖出10,获利4,总获利8;
//但是还有一种方式是买入1,直接卖出10,获利9,显然第二种方式获利更多。
//所以在每次买入卖出时,要甄别下次买入的价格是否大于现在的卖出价格;
//如果大于,则选择第二种方式,小于则分两次进行买入卖出。
for (int n = j+1; n < prices.size(); n++)
{

					for (int m = n + 1; m < prices.size(); m++)
					{
						if (prices[n] < prices[m])
						{
							next_price_in = prices[n];
							next_price_out = prices[m];
							cout << "下次预定买入价格为:" << next_price_in << " ," << "下次暂定卖出价格为:" << next_price_out << endl;
							k = m;
							//追寻到下次买入卖出的价格,直接跳出循环。
							break;
						}
					}
					if (next_price_out > 0)
						break;
				
				}
				if (next_price_in > price_out)
				{
					//选择第二种方式进行买入卖出
					price_out = next_price_out;
					cout << "重新设定卖出价格为:" << price_out << endl;
					i = k;
				}
				else
				{
					//选择第一种方式买入卖出
					i = j;   //跳出循环后j自动加1
				}
				Profit_Sum = Profit_Sum + (price_out - price_in);
				cout << "买入:" << price_in << endl;
				cout << "买出:" << price_out << endl;
				cout << "获利:" << Profit_Sum << endl;
				cout << endl;
			}
		}
		if (price_out == 0)
			Profit_Sum = 0;
	}
	return Profit_Sum;
}

};

int main()
{
vectorprices{7,1,5,6,10,4 };
Solution Stock_price;
int Profit = 0;
Profit = Stock_price.maxProfit(prices);
cout << “最大获利为:” << Profit << endl;
system(“pause”);
return 0;
}
输出结果如下:
Leetcode探究初级算法题目:买卖股票的最佳时机 II_第1张图片
首先搜寻到第一种买入卖出方式:买入7,卖出10;然后查找区间7和10之间是否还有更低买入价格,从10 往前搜,搜得最低买入价格1,然后重新确定卖出价格为5,预定下次买入价格为6,卖出价格10,但是这种方式第二次买入价格大于第一次卖出价格,所以选择一次性买入卖出方式。买入1,卖出10,利润9.
当然这个算法题目的实现方式并不止这一种,我只是给出了我的方案,仅供大家参考!!!

你可能感兴趣的:(c++)