问题描述:给定一个数组,他的第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;
}
}