风口的猪 -- 2016小米笔试题
题目描述:
风口之下,猪都能飞。当今中国股市牛市,真可谓“错过等七年”。
给你一个回顾历史的机会,已知一支股票连续n天的价格走势,以长度为n的整数数组表示,数组中第i个元素(prices[i])代表该股票第i天的股价。
假设你一开始没有股票,但有至多两次买入1股而后卖出1股的机会,并且买入前一定要先保证手上没有股票。若两次交易机会都放弃,收益为0。
设计算法,计算你能获得的最大收益。 输入数值范围:2<=n<=100,0<=prices[i]<=100
示例1
输入 3,8,5,1,7,8
输出 12
解题思路:
这题其实就是一道动态规划题,入手点就是股票最多交易2次,那么我们可以建立2个数组,第一个数组int[] left描述只考虑当天和当天之前的股票价格时每一天的最大收益,第二个数组int[] right描述只考虑当天和当天之后的股票价格时每一天的最大收益,然后left[i] + right[i+1] 的最大值即为所求, i的取值范围是 0 <= i <= n - 2,
接着分析如何计算left 和right ,拿left来说,可以发现当天的最大收益 = max(前一天的最大收益, 当天的股票价格 - 当天之前的最低股票价格) ,边界是left[0] = 0,
right就是 当天的最大收益 = max(后一天的最大收益, 当天之后的最高股票价格 - 当天股票价格) ,边界是right[n-1] = 0,
有了思路就可以用动态规划算法 写for循环 求出left right数组中的值,
完整代码如下:
1 package ustb.xiaomi; 2 3 public class MaxStockIncome { 4 public static int getMaxStockIncome(int[] prices) { 5 int n = prices.length; 6 int[] left = new int[n]; //描述只考虑当前天和当前天之前的股票价格时每一天的最大收益 7 int[] right = new int[n]; //描述只考虑当前天和当前天之后的股票价格时每一天的最大收益 8 int leftMinValue = prices[0]; //描述当前天之前的最低股票价格 9 int rightMaxValue = prices[n-1]; //描述当前天之后的最高股票价格 10 int maxStockIncome = 0; 11 12 for (int i = 1; i < n-1; i++) { //left[n-1]没必要算 13 left[i] = Math.max(left[i-1], prices[i] - leftMinValue); 14 if (prices[i] < leftMinValue) 15 leftMinValue = prices[i]; 16 } 17 18 for (int i = n-2; i > 0; i--) { //right[0]没必要算 19 right[i] = Math.max(right[i+1], rightMaxValue - prices[i]); 20 if (prices[i] > rightMaxValue) 21 rightMaxValue = prices[i]; 22 } 23 24 for (int i = 0; i < n-1; i++) { 25 int temp = left[i] + right[i+1]; 26 if (temp > maxStockIncome) { 27 maxStockIncome = temp; 28 } 29 } 30 return maxStockIncome; 31 } 32 33 34 public static void main(String[] args) { 35 int[] prices = {3, 8, 5, 1, 7, 8}; 36 System.out.println(MaxStockIncome.getMaxStockIncome(prices)); 37 } 38 }

浙公网安备 33010602011771号