25 递归、动态规划和贪心算法解买卖股票的最佳时机II

问题描述:给定一个数组,他的第i个元素是一只给定股票第i天的价格,请你设计一个算法计算你所能获得的最大利润。你可以尽可能多的完成更多的交易。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)

例如:输入[7,1,5,3,6,4]
输出:7
解释:在第2天(股票价格=1)的时候买入,在第3天(股票价格=5)的时候卖出,这笔交易所能获得利润=5-1=4.
        随后,在第4天(股票价格=3)的时候买入,在第五天(股票价格=6)的时候卖出,这笔交易所能获得利润=6-3=3

递归求解思路:使用一个参数变量表示是否当前手里有股票,若有股票则可以进行卖出或者不卖出,若当前手里没有股票,则可以选择卖出和保持。且在最后一天如果手里持有股票则一定要卖出去,

public int getMaxProfit(int []prices,int index,int isHave)
{
if(index==prices.length-1)
{
if(isHave)
{
return prices[prices.length-1];
}else
{
return 0;
}
}
if(isHave)
{
return Math.max(prices[index]+getMaxProfit(prices,index+1,false)  getMaxProfit(prices,index+1,true));
}else
{
return Math.max(getMaxprofit(prices,index+1,false) -prices[i]+getMaxProdit(prices,index+1,true));
}
}
public GetMaxProfit(int []prices,int index,int isHave)
{
getMaxProfit(prices,0,false);
}

动态规划求解思路:定义二维数组dp[i][0]和dp[i][1]分别表示第i天手里没有股票的最大利润和第i天手里有股票的最大利润

public getMaxProfit(int []prices)
{
int [][]dp=new int[prices.length][2];
dp[0][0]=0;
dp[0][1]=-prices[0];
for(int i=1;i<prices.length;i++)
{
dp[i][0]=Math.max(dp[i-1][0],prices[i]+dp[i-1][1]);
dp[i][1]=Mah.max(dp[i-1][1],-prices[i]+dp[i-1][0]);
}
//最后一天一定要没有股票才能最大
return dp[price.length-1][0];
}

贪心算法:可以求解数列中所有的上升子序列,并计算差值即可;采用双指针求解

public getMaxProfit(int[]prices)
{
int slowIndex=0;
int fastIndex=1;
int sum=0;
while(fastIndex<prices.length)
{
if(prices[falstIndex]>=prices[falstIndex-1])
{
fastIndex++;
}else
{
int fastTempIndex=fastIndex-1;
sum=prices[fastTempIndex]-prices[slowIndex];
slowIndex=fastIndex;
falstIndex=fastindex+1;

}

}
if(fastIndex-1==prices.length)
{
return sum+prices[prices.length-1]-prices[slowIndex];
}else
{
return sum;
​​​​​​​}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值