2016小米-风口的猪-中国牛市-Java
生活随笔
收集整理的這篇文章主要介紹了
2016小米-风口的猪-中国牛市-Java
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
解題思路:可能是我的理解力有限,但總感覺題目描述的理解起來費勁。
題目抽象一下,就是給定一個數組,按照某種規則找出這個數組的最大值。規則:最多取兩個數,然后丟到一個數,看看手中的數的最大值。賣出為+,買入為-。
利用動態規劃來考慮:從數組的左側到右側遍歷,計算最大值保存成數組,同理從右側到左側,計算最大值保存成數組。找兩個數組對應值得和,找出最大值。
1、從左到右掃描一遍,dpl[i]表示到i位置最大的收益;計算最大收益:用minIndex取得最大收益時較小值的位置。
? ? ? ? 1.1若prices[i+1] ?> prices[i],則dpl[i+1] 是 dpl[i]或者prices[i+1]-prices[minIndex]的最大值。
? ? ? ? 1.2若prices[i+1] < prices[i],則prices[i+1]-prices[minIndex]一定比dpl[i]要小,故dpl[i+1] = dp[i]。
? ? ? ? 同時,判斷當前的prices[i]是否小于prices[minIndex],如果小于則修改minIndex的值。
2、同理,從右到左掃描,并記錄dpr[i]的所有值。
/*** 題目描述 風口之下,豬都能飛。當今中國股市牛市,真可謂“錯過等七年”。* 給你一個回顧歷史的機會,已知一支股票連續n天的價格走勢,以長度為n的整數數組表示,數組中第i個元素(prices[i])代表該股票第i天的股價。* 假設你一開始沒有股票,但有至多兩次買入1股而后賣出1股的機會,并且買入前一定要先保證手上沒有股票。若兩次交易機會都放棄,收益為0。* 設計算法,計算你能獲得的最大收益。 輸入數值范圍:2<=n<=100,0<=prices[i]<=100 * 示例1 輸入 * 3,8,5,1,7,8 * 輸出 * 12* @author 崔洪振367* @version 創建時間:2017年6月30日 下午11:06:29* 解題思路:迷迷糊糊的。* */ public class 風口的豬_中國牛市 {/*** 計算你能獲得的最大收益* * @param prices Prices[i]即第i天的股價* @return 整型*/public int calculateMax(int[] prices) {int len = prices.length;int[] dpl = new int[len];dpl[0] = 0;int minIndex = 0;//最小值的下標//從左到右,求收益最大值放入dpl中for(int i=1; i<len; i++){if(prices[i] > prices[i-1]){dpl[i] = Math.max(prices[i] - prices[minIndex], dpl[i-1]);//動態規劃,利用前邊的值填寫后邊的值}else{dpl[i] = dpl[i-1];if(prices[i] < prices[minIndex]){minIndex = i;}}}//從右到左,求收益最大值int[] dpr = new int[len];dpr[len-1] = 0;//最左端的初始值賦值為0int maxIndex = len-1;//最大值的下標for(int i=len-2; i>=0; i--){if(prices[i] < prices[i+1]){dpr[i] = Math.max(prices[maxIndex] - prices[i], dpr[i+1]);}else {dpr[i] = dpr[i+1];if(prices[maxIndex] < prices[i]){maxIndex = i;}}}//根據輸入dpl和dpr求解整個過程的最大值。//說白了,就是將一個數組分成兩部分,然后求各部分的最大值,輸出最大值。int result = 0;for(int i=0; i<len; i++){result = Math.max(dpl[i]+dpr[i], result);}return result;}}總結
以上是生活随笔為你收集整理的2016小米-风口的猪-中国牛市-Java的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iterm2 ssh 乱码_Royal
- 下一篇: 利用zui上传excel文件,并通过ja