Maison > Java > javaDidacticiel > le corps du texte

Programmation dynamique LeetCode Day, partie 8

WBOY
Libérer: 2024-07-17 11:39:09
original
1026 Les gens l'ont consulté

LeetCode DayDynamic Programming part8

121. Meilleur moment pour acheter et vendre des actions

Vous recevez un tableau de prix où prix[i] est le prix d'une action donnée le ième jour.

Vous souhaitez maximiser votre profit en choisissant un seul jour pour acheter une action et en choisissant un autre jour dans le futur pour vendre cette action.

Rendez le profit maximum que vous pouvez réaliser grâce à cette transaction. Si vous ne pouvez réaliser aucun profit, renvoyez 0.

Exemple 1 :

Entrée : prix = [7,1,5,3,6,4]
Sortie : 5
Explication : Achetez le jour 2 (prix = 1) et vendez le jour 5 (prix = 6), profit = 6-1 = 5.
Notez qu'acheter le jour 2 et vendre le jour 1 n'est pas autorisé car vous devez acheter avant de vendre.
Exemple 2 :

Entrée : prix = [7,6,4,3,1]
Sortie : 0
Explication : Dans ce cas, aucune transaction n'est effectuée et le profit max = 0.

Contraintes :

1 <= prix.longueur <= 10^5
0 <= prix[i] <= 10^4
Page originale

Méthode 1, algorithmes gourmands

    public int maxProfit(int[] prices) {
        if(prices.length == 0){
            return 0;
        }

        int profit = 0;
        int buy = prices[0];
        for(int i=1; i<prices.length; i++ ){
            if(buy>=prices[i]){
                buy = prices[i];
            }else{
                profit = Math.max(profit, prices[i]-buy);
            }
        }
        return profit;
    }



</p>
<p>temps O(n) espace O(1)</p>
<h2>
  
  
  Méthode 2 sur 3: Programmation dynamique
</h2>


<pre class="brush:php;toolbar:false">    public int maxProfit(int[] prices) {
        if(prices.length == 0){
            return 0;
        }

        // 2 means we have 2 different status (have owned stock or not )
        int[][] dp = new int[prices.length][2];

        // if we want to own the stock we should pay for the specific price
        dp[0][0] = -prices[0];
        for(int i=1; i<dp.length; i++){
            dp[i][0] = Math.max(dp[i-1][0], -prices[i]);
            dp[i][1] = Math.max(dp[i-1][1], prices[i] + dp[i-1][0]);
        }
        // Arrays.stream(dp).map(Arrays::toString).forEach(System.out::println);
        return dp[dp.length-1][1];
    }
Copier après la connexion

temps O(n) espace O(n)
La programmation dynamique est plus générale que les algorithmes gloutons car elle ne fonctionnera pas uniquement pour un problème spécifique.

Méthode 2.1 (améliorer la complexité de l'espace)

    public int maxProfit(int[] prices) {
        if(prices.length == 0){
            return 0;
        }

        // 2 means we have 2 different status (have owned stock or not )
        int[] dp = new int[2];

        // if we want to own the stock we should pay for the specific price
        dp[0] = -prices[0];
        for(int i=1; i<prices.length; i++){
            dp[1] = Math.max(dp[1], prices[i] + dp[0]);
            dp[0] = Math.max(dp[0], -prices[i]);
        }
        // 
        return dp[1];
    }

Copier après la connexion

Soyez prudent ici, nous devons d'abord traiter dp[1] car il utilisera le dp[0] précédent au lieu du dp[0] mis à jour.

122. Meilleur moment pour acheter et vendre des actions II

Vous recevez un tableau de prix entiers où prix[i] est le prix d'une action donnée le ième jour.

Chaque jour, vous pouvez décider d'acheter et/ou de vendre des actions. Vous ne pouvez détenir qu’une seule action à la fois. Vous pouvez cependant l'acheter puis le revendre immédiatement le jour même.

Trouvez et restituez le profit maximum que vous pouvez réaliser.

Exemple 1 :

Entrée : prix = [7,1,5,3,6,4]
Sortie : 7
Explication : Achetez le jour 2 (prix = 1) et vendez le jour 3 (prix = 5), profit = 5-1 = 4.
Puis achetez le jour 4 (prix = 3) et vendez le jour 5 (prix = 6), profit = 6-3 = 3.
Le bénéfice total est de 4 + 3 = 7.
Exemple 2 :

Entrée : prix = [1,2,3,4,5]
Sortie : 4
Explication : Achetez le jour 1 (prix = 1) et vendez le jour 5 (prix = 5), profit = 5-1 = 4.
Le bénéfice total est de 4.
Exemple 3 :

Entrée : prix = [7,6,4,3,1]
Sortie : 0
Explication : Il n'y a aucun moyen de réaliser un profit positif, nous n'achetons donc jamais d'actions pour atteindre le profit maximum de 0.

Contraintes :

1 <= prix.longueur <= 3 * 10……4
0 <= prix[i] <= 10……4

    public int maxProfit(int[] prices) {
        if(prices.length <1){
            return 0;
        }

        int[][] dp = new int[prices.length][2];
        dp[0][0] = -prices[0];

        for(int i=1; i<prices.length; i++){
            //only when we do not own the stack we can buy a new stock
            dp[i][0] = Math.max(dp[i-1][1]-prices[i], dp[i-1][0]);
            dp[i][1] = Math.max(dp[i-1][0]+prices[i], dp[i-1][1]);
        }

        return dp[prices.length-1][1];
    }
Copier après la connexion

La méthode du tableau roulant

    public int maxProfit(int[] prices) {
        if(prices.length <1){
            return 0;
        }

        int[] dp = new int[2];
        dp[0] = -prices[0];

        for(int i=1; i<prices.length; i++){
            //only when we do not own the stack we can buy a new stock
            dp[1] = Math.max(dp[0]+prices[i], dp[1]);
            dp[0] = Math.max(dp[1]-prices[i], dp[0]);

        }

        return dp[1];
    }
Copier après la connexion

123. Meilleur moment pour acheter et vendre des actions III

Vous recevez un tableau de prix où prix[i] est le prix d'une action donnée le ième jour.

Trouvez le profit maximum que vous pouvez réaliser. Vous pouvez effectuer au plus deux transactions.

Remarque : vous ne pouvez pas effectuer plusieurs transactions simultanément (c'est-à-dire que vous devez vendre l'action avant d'acheter à nouveau).

Exemple 1 :

Entrée : prix = [3,3,5,0,0,3,1,4]
Sortie : 6
Explication : Achetez le jour 4 (prix = 0) et vendez le jour 6 (prix = 3), profit = 3-0 = 3.
Puis achetez le jour 7 (prix = 1) et vendez le jour 8 (prix = 4), profit = 4-1 = 3.
Exemple 2 :

Entrée : prix = [1,2,3,4,5]
Sortie : 4
Explication : Achetez le jour 1 (prix = 1) et vendez le jour 5 (prix = 5), profit = 5-1 = 4.
Notez que vous ne pouvez pas acheter le jour 1, acheter le jour 2 et les vendre plus tard, car vous effectuez plusieurs transactions en même temps. Vous devez vendre avant d'acheter à nouveau.
Exemple 3 :

Entrée : prix = [7,6,4,3,1]
Sortie : 0
Explication : Dans ce cas, aucune transaction n'est effectuée, c'est à dire profit max = 0.

Contraintes :

1 <= prix.longueur <= 10^5
0 <= prix[i] <= 10^5

    public int maxProfit(int[] prices) {
        int transactions = 2;
        int[][] dp = new int[prices.length][transactions*2+1];
        for(int i=1; i<=transactions; i++){
            dp[0][i*2-1] = -prices[0];
        }

        for(int i=1; i<prices.length; i++){

            dp[i][1] = Math.max(dp[i-1][0]-prices[i], dp[i-1][1]);
            dp[i][2] = Math.max(dp[i-1][1]+prices[i], dp[i-1][2]);
            dp[i][3] = Math.max(dp[i-1][2]-prices[i], dp[i-1][3]);
            dp[i][4] = Math.max(dp[i-1][3]+prices[i], dp[i-1][4]);
        }
        Arrays.stream(dp).map(Arrays::toString).forEach(System.out::println);

        return dp[prices.length-1][4];
    }
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!