笔试题:风口之下,猪都能飞。设计算法,计算你能获得的最大收益。

风口之下,猪都能飞。当今中国股市牛市,真可谓“错过等七年”。 给你一个回顾历史的机会,已知一支股票连续n天的价格走势,以长度为n的整数数组表示,数组中第i个元素(prices[i])代表该股票第i天的股价。 假设你一开始没有股票,但有至多两次买入1股而后卖出1股的机会,并且买入前一定要先保证手上没有股票。若两次交易机会都放弃,收益为0。 设计算法,计算你能获得的最大收益。 输入数值范围:2<=n<=100,0<=prices[i]<=100 


Input:                        Output:
3,8,5,1,7,8           12

思路:
  • 从cut_i 位置分为左右两部分分别求最大差值
  • 差值为正,且最大值在最小值的右边
  • 当只有两个数时,返回为最大差值为0


//从中间分开,分别找两边最大差值(小值在左大值在右)
int MaxDValue(vector<int> prices, int begin, int end)
{
	//小值在左大值在右
	int tmp1 = begin;
	int tmp2 = begin;
	int max = 0;
	int div = 0;
	for (; tmp1 <= end; tmp1++)
	{
		for (tmp2 = tmp1 + 1; tmp2 <= end; tmp2++)
		{
			div = prices[tmp2] - prices[tmp1];
			max = max > div ? max : div;
		}
	}

	return max;
}

int calculateMax(vector<int> prices)
{
	int cut_i = 1;
	int size = prices.size();
	int max = 0;
	int tmp = 0;
	if (size <= 1)
		return 0;

	for (cut_i = 1; cut_i < size; cut_i++)
	{
		tmp = MaxDValue(prices, 0, cut_i) + MaxDValue(prices, cut_i, size - 1);
		max = max > tmp ? max : tmp;
	}
	return max;
}


int main()
{
	vector<int> ax = { 3, 8, 0, 1, 7, 8 };
	cout << calculateMax(ax) << endl;

	vector<int> ax1 = { 1,12 };
	cout << calculateMax(ax1) << endl;

	vector<int> ax2 = { 19, 5 };
	cout << calculateMax(ax2) << endl;
	system("pause");
	return 0;

}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值