Sujet:
É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: Achat le 2e jour (cours de l'action = 1), le 5e jour (cours de l'action = 6) Vendre, profit 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.
Idées de résolution de problèmes: La
première pensée a été la méthode de la force brute, puis il a fallu plus de 500 ms. . .
Ensuite, j'ai pensé à la solution suivante que je n'ai bouclée qu'une seule fois. Je me sentais un peu fatigante, alors j'ai regardé la solution. emmm. .
Loi sur la violence:
class Solution {
public:
int maxProfit(vector<int>& prices) {
if(0 == prices.size()) return 0;
int left = prices[0]+1;
int max = 0;
for(int i=0;i<prices.size();i++){
if(left>prices[i]){
left = prices[i];
for(int j=i+1;j<prices.size();j++){
if(prices[j]>left && (prices[j]-left)>max){
max = prices[j] - left;
}
}
}
}
return max;
}
};
Une traversée (beaucoup moins de temps):
class Solution {
public:
int maxProfit(vector<int>& prices) {
if(0 == prices.size()) return 0;
int left = prices[0]+1;
int max = 0;
for(int i=0;i<prices.size();i++){
if(left>prices[i]){
left = prices[i];
}else if(prices[i]-left>max){
max = prices[i]-left;
}
}
return max;
}
};
Exemple avec un temps d'exécution de 0 ms:
Explication: le code de cet exemple est transmisTraversée inverséeTableau, puis déterminez la valeur maximale et utilisez la valeur maximale pour soustraire les nombres parcourus vers l'avant pour déterminer le profit maximal.
class Solution {
public:
int maxProfit(vector<int>& prices) {
int MAX=-1;
int res=0;
for(auto it=prices.rbegin();it!=prices.rend();it++)
{
if(it!=prices.rbegin())
res=max(res,MAX-*it);
MAX=max(MAX,*it);
}
return res;
}
};