Tencent 47-le meilleur moment pour acheter et vendre des actions

Tencent 47-le meilleur moment pour acheter et vendre des actions

Étant donné un tableau, le i-ème élément est le prix du i-ème jour d'un stock donné.

Si vous n'êtes autorisé qu'à effectuer une transaction au maximum (c'est-à-dire acheter et vendre un stock), concevez un algorithme pour calculer le profit maximum que vous pouvez obtenir.

Notez que vous ne pouvez pas vendre d'actions avant de les acheter.

Exemple 1:

Entrée: [7,1,5,3,6,4]
Sortie: 5
Explication: Acheter le 2e jour (cours de l'action = 1), vendre le 5e jour (cours de l'action = 6), Bénéfice maximum = 6-1 = 5.
Notez que le profit ne peut pas être 7-1 = 6, car le prix de vente doit être supérieur au prix d'achat.
Exemple 2:

Entrée: [7,6,4,3,1]
Sortie: 0
Explication: Dans ce cas, aucune transaction n'est terminée, donc le profit maximum est 0.

Analyse:

  • Les besoins en stock ici, acheter avant de vendre
  • Achetez et vendez deux variables, si vous utilisez dp [i] [j], c'est o (n * n), ce qui équivaut à de la violence et n'est pas souhaitable
  • Parce que le stock sera vendu tôt ou tard, même si le résultat final est 0, ce qui équivaut à ne pas vendre, il peut être considéré comme vendu le 0e jour
  • Donc, utilisez dp [i] pour représenter le gain maximum si vous vendez des actions le i-ème jour, dp [0] = 0, s'il n'y a pas de revenu le premier jour, il est logique de dp [1]
  • dp [i] signifie que si vous vendez des actions le i-ème jour, vous devez certainement soustraire la valeur minimale précédente, utilisez donc un min_cur, ce qui signifie qu'à partir du i-ème jour, y compris la valeur minimale
  • En résumé, res est la valeur maximale en dp [i]
class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        #这里股票要求,先买后卖
        #买卖两个变量,如果用dp[i][j],就是o(n*n),等同于暴力
        #因为股票迟早要卖的,即使最后结果是0,相当于不卖,可认为是第0天卖的
        #所以用dp[i]表示如果第i天卖股票,能获得的最大收益,dp[0]=0,第一天没收入的,从dp[1]开始才有意义
        #dp[i]表示如果第i天卖股票,肯定要减去之前的最小值,所有用一个min_cur,表示截止第i天,包括第i天的最小值
        #综上,res就是dp[i]中的最大值
        if len(prices)==0 or len(prices)==1:return 0
        else:
            res=0
            min_cur,dp=prices[0],[0]
            for i in range(1,len(prices)):
                min_cur=min(min_cur,prices[i])
                dp.append(prices[i]-min_cur if prices[i]-min_cur>0 else 0)
                res=max(res,dp[-1])
        return res
Publié 93 articles originaux · loué 8 · 10 000+ vues

Je suppose que tu aimes

Origine blog.csdn.net/zlb872551601/article/details/103652624
conseillé
Classement