做爲一名從副業中已賺取幾個月工資的韭菜,顯然對這類題目頗有搞頭,可是實際中每每不知道的是股票的將來價格,因此須要預測,而你的實盤實際上也會反過來影響股票,因此沒人能完整預測股票的走勢,那些從回溯中取的最大值的算法,就是下面的幾種,有必要掌握一下,倘若某一天你穿越回去,你任選一種算法,那麼你就能夠從1萬到1個億,可能一個月就夠了,哦,對了,若是有人能穿越過去,記得帶我一下。。。。。算法
// 股票只容許買賣一次 可利用貪心 找到最小的min 價格 再去找最大的max 價格 那麼二者之間的差值就是 結果 public int maxProfit(int[] prices) { if (prices.length == 0) return 0; int min = prices[0]; int res = 0; for (int i = 1; i < prices.length; i++) { res =Math.max(res,prices[i]-min); min = Math.min(min,prices[i]); } return res; }
public int maxProfit(int[] prices) { if(prices.length == 0)return 0; int sell = 0; int buy = Integer.MIN_VALUE; for (int i = 0; i < prices.length; i++) { int t = sell; sell = Math.max(sell,prices[i] + buy); buy = Math.max(buy,t-prices[i]); } return sell; }
public int maxProfit(int[] prices) { if (prices.length == 0)return 0; int k = 2; int[][][] dp = new int[prices.length][k+1][2]; for (int i = 0; i < prices.length; i++) { for (int j = 1; j <= k ; j++) { if (i == 0){ dp[i][j][1] = -prices[i]; }else { dp[i][j][0] = Math.max(dp[i-1][j][0],prices[i]+dp[i-1][j][1]); dp[i][j][1] = Math.max(dp[i-1][j][1],dp[i-1][j-1][0]-prices[i]); } } } return dp[prices.length -1][k][0]; }
//這個是 買入k 次 可是 k 大於 數組長度的一半時候 實際和無限買入狀況是同樣的 能夠加快速度 public int maxProfit(int k, int[] prices) { if (prices.length == 0) return 0; if ( k > prices.length/2){ return fastMaxProfit(prices); } int[][][] dp = new int[prices.length][k+1][2]; for (int i = 0; i < prices.length; i++) { for (int j = 1; j <= k; j++) { if (i == 0){ dp[i][j][1] = -prices[i]; }else { dp[i][j][0] = Math.max(dp[i-1][j][0],dp[i-1][j][1] + prices[i]); dp[i][j][1] = Math.max(dp[i-1][j][1],dp[i-1][j-1][0] - prices[i]); } } } return dp[prices.length - 1][k][0]; } int fastMaxProfit(int[] price) { if (price.length == 0) return 0; int sell = 0; int buy = -price[0]; for (int i = 0; i < price.length; i++) { int t = sell; sell = Math.max(sell,price[i] + buy); buy = Math.max(buy,t - price[i]); } return sell; }
//有冷凍期 就是 sell 保存多一天 public int maxProfit(int[] prices) { if (prices.length == 0) return 0; int sell = 0; int prev = 0; int buy = -prices[0]; for (int i = 0; i < prices.length; i++) { int t = sell; sell = Math.max(sell,prices[i] + buy); buy = Math.max(buy,prev - prices[i]); prev = t; } return sell; }
// 思路 每次 交易的時候再減去手續費便可 public int maxProfit(int[] prices, int fee) { if (prices.length == 0) return 0; int sell = 0; int buy = -prices[0] - fee; for (int i = 0; i < prices.length; i++) { int t = sell; sell = Math.max(sell,prices[i] + buy); buy = Math.max(buy,t - prices[i] - fee); } return sell; }
吳邪,小三爺,混跡於後臺,大數據,人工智能領域的小菜鳥。
更多請關注數組