算法 - 如何從股票買賣中,獲得最大收益


作為一名從副業中已賺取幾個月工資的韭菜,顯然對這類題目很有搞頭,但是實際中往往不知道的是股票的未來價格,所以需要預測,而你的實盤實際上也會反過來影響股票,所以沒人能完整預測股票的走勢,那些從回溯中取的最大值的算法,就是下面的幾種,有必要掌握一下,假若某一天你穿越回去,你任選一種算法,那么你就可以從1萬到1個億,可能一個月就夠了,哦,對了,如果有人能穿越過去,記得帶我一下。。。。。

121. 買賣股票的最佳時機

// 股票只允許買賣一次 可利用貪心 找到最小的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;
}

122. 買賣股票的最佳時機 II

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;
}

123. 買賣股票的最佳時機 III

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];
}

188. 買賣股票的最佳時機 IV

//這個是 買入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;
    }

309. 最佳買賣股票時機含冷凍期

//有冷凍期 就是 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;

}

714. 買賣股票的最佳時機含手續費

// 思路 每次 交易的時候再減去手續費即可
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;

}

吳邪,小三爺,混跡於后台,大數據,人工智能領域的小菜鳥。
更多請關注
file


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM