股票最大收益问题及数组最大差值问题

</pre><pre code_snippet_id="656629" snippet_file_name="blog_20150430_2_4601523" name="code" class="cpp">

 
#include<stdio.h>
#include <stdlib.h>
//说明 只有返回值为零 则表示没有收益 或者没有找到最多的差值哦
int max_profit(int a[],int length)  //n 天中 买卖股票最大收益 不限次数
{
	if(length==0) return 0;
	int max = 0;
	int index_minbuy = 0;
	for(int i =1;i<length;i++)
	{
		if(a[i]<a[i-1])
		{
			//贪心法,第I天跌了 则这个时候则应该在第i -1 天的时候 卖出 然后在第I天买入
			max += a[i-1] - a[index_minbuy];
			index_minbuy = i;
		}
	}
	//最后一天要单独计算
	if(a[length -1] > a[index_minbuy])
		max += a[length - 1] - a[index_minbuy];
	return max;
}
//最有解法二 计算每个相邻的差,大于零 则利润累加   <span style="font-family: Arial, Helvetica, sans-serif;">n 天中 买卖股票最大收益 不限次数</span>

int max_p(int a[],int length)
{
	if(length==0) return 0;
	int max = 0;
	for(int i =1;i<length;i++)
	{
		if(a[i-1] <a[i])
		{
			max += a[i] - a[i-1];
		}
	}
	return max;
}

int findMaxDiff_1(int* a,int lengh) //右边>左边 求一个数组中最大差值 
{
	int i = 0;
	if(lengh==0||lengh==1) return 0;
	if(lengh==2)
	{
		return (a[2] - a[1] > 0?a[2] - a[1]:0);
	}
	int min = a[0];
	int max = a[2] - a[1];
	for(int i =2;i<lengh;i++)
	{
		if(a[i-1]<min)
		{
			min = a[i-1];
		}
		if(a[i] - min >max)
		{
			max = a[i] - min;
		}
	}
	return max;
}  

int findMaxDiff_2(int* a,int lengh) //左边 > 右边   <span style="font-family: Arial, Helvetica, sans-serif;">求一个数组中最大差值 </span>

{
	int i = 0;
	if(lengh==0||lengh==1) return 0;
	if(lengh==2)
	{
		return (a[1] - a[2] > 0?a[1] - a[2]:0);
	}
	int max = a[0];
	int max_ = a[1] - a[2];
	for(int i =2;i<lengh;i++)
	{
		if(a[i-1]>max)
		{
			max = a[i -1];
		}
		if(max - a[i] >max_ )
		{
			max_ = max - a[i];
		}
	}
	return max_;
}  

int max_two_profit(int a[],int length)  //股票最大收益 只允许最多买卖两次 
{
	if(length==0||length==1) return 0;
	if(length==2)
	{
		return (a[2] - a[1] > 0)?a[2] - a[1]:0;
	}
	int max_pro = 0;
	for(int i =1;i<length-1;i++)
	{
		if(findMaxDiff_1(a,i+1) + findMaxDiff_1(a+i,length - i) > max_pro)
			max_pro = findMaxDiff_1(a,i+1) + findMaxDiff_1(a+i,length - i);
		
	}
	return max_pro;
}
int main()

{
	int a[] = {1,4,2,8,100};
	printf("%d\n",max_profit(a,5));
	printf("%d\n",max_p(a,5));
	printf("%d\n",findMaxDiff_2(a,5));
	printf("%d\n",max_two_profit(a,5));
	system("pause");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值