标签:+= 最大值 sel and 最小值 time length png 获得
一、题目
1、审题
2、分析
给出一个数组,让你先已 val1 买入,再 以 val2 卖出,求获得的利润最大是多少。
二、解答
1、思路:
方法一、
用遍历 min 记录到当前位置的最小值;
max 记录到当前数组值的价格卖出为止时获得的最大利润。
public int maxProfit(int[] prices) { if(prices.length < 2) return 0; int min = prices[0]; int max = 0; for (int i = 1; i < prices.length; i++) { if(prices[i] - min > 0 && prices[i] - min > max) { max = prices[i] - min; } else if(prices[i] < min) min = prices[i]; } return max; }
优化:
变量 minPrice 直接记录当前的最小价值。
public int maxProfit3(int[] prices) { int minprice = Integer.MAX_VALUE, max = 0; for (int i = 1; i < prices.length; i++) { minprice = Math.min(minprice, prices[i]); max = Math.max(max, prices[i] - minprice); } return max; }
方法二、
采用 “Kadane‘s Algorithm.”,即采用求连续子串最大和的思想。
curMax: 以当前价格卖出时获得的利润(若不赚钱就不卖出)。
①、若 curMax = 0, 即代表当前值比前边的值都小;
②、若 curMax > 0,即, curMax = (price[i-1] - price[i - 2] + price[i] - price[i-1]) = price[i] - price[i-1]。即为 当前价格为最大值,且减去的是前边的最小值。
max: 总的过程中的最大利润。
public int maxProfit2(int[] prices) { int curMax = 0, max = 0; for (int i = 1; i < prices.length; i++) { curMax = Math.max(0, curMax += prices[i] - prices[i-1]); max = Math.max(curMax, max); } return max; }
121. Best Time to Buy and Sell Stock
标签:+= 最大值 sel and 最小值 time length png 获得
原文地址:https://www.cnblogs.com/skillking/p/9748895.html