风口的猪 -- 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 }

 

posted @ 2017-08-30 10:58  红茶不知道  阅读(572)  评论(0)    收藏  举报