Algorithme pratique délibérée le meilleur moment pour acheter et vendre des actions de combat -LeetCode 06- III

Titre: Le meilleur moment pour acheter et vendre des stocks III

Liens: le meilleur moment pour acheter et vendre des actions III
d'abord, je suivre mes propres idées pour essayer de répondre, est probablement comme ceci: divisé en deux cas, un et deux affaires de négociation.
Une transaction: essentiellement à la recherche des numéros de différence maximale et l'arrière d'une rangée intérieure devant
deux négociation: A partir de la longueur de chaque vente, la vente et de définir la durée de la première transaction dans le second sont i et j (ajout du premier jour pour acheter et vendre le lendemain , quand il était un long 2). Puis itérer par la vente de la première et la deuxième vente d'une variété de longueur de temps possible, garder le bénéfice maximum.
codes détaillés sont les suivants:

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int dif1 = 0, dif2 = 0, dif; //dif1为一次买卖的最大收益,dif2为两次买卖的最大收益,dif为总的最大收益
        int n = prices.size();
        int mon, thu; //在两次买卖情况下第一次和第二次买卖的收益
        
        //一次买卖
        for(int i = 0; i < n; i++)
        {
            for(int j = i + 1; j < n; j++)
            {
                dif1 = max(dif1, prices[j] - prices[i]); //更新最大收益
            }
        }

		//二次买卖
        for(int i = 2; i <= n - 2; i++) //i为第一次买卖的时长
        {
            for(int j = 2; j <= n - 2; j++) //j为第二次买卖的时长
            {
                for(int k = 0; k <= n - i; k++) //k为第一次买卖的开始
                {
                    for(int s = k + i; s <= n - j; s++) //s为第二次买卖的开始
                    {
                        mon = prices[k + i - 1] - prices[k];
                        thu = prices[s + j - 1] - prices[s];
                        dif2 = max(dif2, mon + thu); //更新最大收益
                    }
                }
            }
        }

        dif = max(dif1, dif2);
        return dif;
    }
};

Oui, en fait j'ai passé quatre cycles , cela devrait être une solution relativement simple, mais il est très mauvais en termes de complexité de temps de celui - ci, si LeetCode donné ci - après jugement équitable:
Insérer ici l'image Description
il semble, mais aussi pense honnêtement une partie de la méthode plus intelligente (see).

Eh bien, je suis revenu après 2h, avec admiration pour l'~~

Fort d' un: automate
lienorigine: Automata

Fort II: Programmation dynamique
copié parévaluation de LeetCode après avoir battucode 100% (ne peut pas trouver le lienorigine)

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n = prices.size();
        if(n==0) return 0;
        int k=2;
        int dp[k+1][2]={0};
        //初始化
        for(int j=1;j<=k;j++) {
            dp[j][0]=0;
            dp[j][1]=-prices[0];
        }
        for(int i=1;i<n;i++){
            for(int j=1;j<=k;j++){
                dp[j][0] = max(dp[j][0], dp[j][1]+prices[i]);
                dp[j][1] = max(dp[j][1], dp[j-1][0]-prices[i]);
            }
        }
        return dp[k][0];
    }
};

Après avoir lu les gros bonnets des idées et du code qui semble peu probable de se retrouver en pensant « orthodoxe », avant qu'il ne soit considéré pour chaque vente avantages, et la plupart des gens doivent tenir compte de la balance des paiements après une seule transaction, qui est au- dessus automatique la machine avec la programmation dynamique point de départ de base. Il semble qu'il a encore un long chemin à parcourir ~ ~ ~ ~

digression:

Pour toutes les questions de vie ou de carrière, le rôle de l' intelligence est beaucoup plus grande que le caractère, pas le cerveau tant que le cœur, pas de génie tant par un sentiment de soi - contrôle, de la patience et des lois.
--- Hemingway "vrai noble"

Publié 16 articles originaux · louanges gagnées 0 · Vues 282

Je suppose que tu aimes

Origine blog.csdn.net/DZZ18803835618/article/details/104689849
conseillé
Classement