/**
* 买卖股票的最佳时机 leetcode121
* prices[i]表示一只股票第i天的价格,选择某天来买进这只股票,并选择在未来某天卖出,获取最大利润
* 示例输入[7,1,5,3,6,4]
* 输出 5
* 说明:在第2天price=1时买入,第5天,price=6时,卖出能获得最大利润 6-1=5
*
* 方法一:动态规划,定义 dp[i][j]数组,dp[i][0]表示第i天卖出股票的利润, dp[i][1]表示第i天持有股票的利润,
* 例如dp[0][0] = 0,第0天不持有股票,利润为0,dp[0][1]表示,第0天持有股票,利润为-prices[0]
* 算法思想,迭代更新dp数组,得出最大利润
* @param prices
* @return
*/
static int maxProfit(int[] prices){
int len = prices.length;
if(len<2){
return 0;
}
int[][] dp = new int[len][2];
dp[0][0] = 0;
dp[0][1] = -prices[0];
for (int i = 1; i <len ; i++) {
//比较昨天卖出利润大还是今天卖出(昨天持有今天卖出)利润大
dp[i][0] = Math.max(dp[i-1][0],dp[i-1][1]+prices[i]);
//比较昨天买入利润大还是今天买入利润大
dp[i][1] = Math.max(dp[i-1][1],-prices[i]);
}
return dp[len-1][0];
}
/**
* 方法二,不使用dp数组,定义变量min记录当前最小股价,寻找最大差价
* @param prices
* @return
*/
static int maxProfit1(int[] prices){
int len = prices.length;
if(len<2){
return 0;
}
int profitMax = 0;
int min = prices[0];
for (int i = 1; i <len ; i++) {
if(prices[i]>min){
profitMax = Math.max(profitMax,prices[i]-min);
}else {
min = prices[i];
}
}
return profitMax;
}