Leetcode Brushing Notes (C++) - Algoritmo Ganancioso
Classifique as ideias no processo de escovar as perguntas, resuma e compartilhe-as aqui.
endereço do github: https://github.com/lvjian0706/Leetcode-solutions
O projeto github acabou de ser criado, e o código organizado e as ideias serão carregados um após o outro. O código é baseado em C++ e python. Ao mesmo tempo, o algoritmo básico de classificação também será classificado e carregado.
122. Melhor Momento para Comprar e Vender Ações II
Dado um array cujo elemento i é o preço de uma determinada ação no dia i.
Projete um algoritmo para calcular o lucro máximo que você pode obter. Você pode concluir o maior número possível de negociações (comprar e vender uma ação várias vezes).
Nota: Você não pode participar de várias transações ao mesmo tempo (você deve vender o estoque anterior antes de comprar novamente).
Exemplo 1:
Entrada: [7,1,5,3,6,4]
Saída: 7
Explicação: Compra no dia 2 (preço da ação = 1), compra no dia 3 (preço da ação = 5) Venda, esta transação pode fazer um lucro = 5-1 = 4.
Então, compre no 4º dia (preço da ação = 3) e venda no 5º dia (preço da ação = 6), esta transação pode dar lucro = 6-3 = 3.
Exemplo 2:
Entrada: [1,2,3,4,5]
Saída: 4
Explicação: Compre no dia 1 (preço da ação = 1), venda no dia 5 (preço da ação = 5), esta transação pode gerar lucro = 5 -1 = 4.
Observe que você não pode comprar ações no dia 1 e no dia 2 consecutivos e vendê-las mais tarde.
Como isso envolve várias transações ao mesmo tempo, você deve vender as ações anteriores antes de comprar novamente.
Exemplo 3:
Entrada: [7,6,4,3,1]
Saída: 0
Explicação: Neste caso, nenhuma negociação é concluída, então o lucro máximo é 0.
方法一:峰顶峰谷
class Solution {
public:
/*
买卖股票的最佳时机:可以尽可能地完成更多的交易;
方法一:可以将价格绘制出来,在拐点处进行买卖即可,极小值点买极大值点卖可以获得最大利润;
编程实现上,当后一个元素大于该元素且前一个元素大于等于该元素时,为极小值点,当前一个元素小于当前元素且后一个元素小于等于该元素时为极大值点;
当极大值更新时,说明卖出了股票,更新收益值。
其中,起始值和末尾值需要单独判断,当起始值后的元素大于该元素时,该元素为极小值,否则极小值初始化为0即可;当末尾值大于前一个元素时,该元素为极大值。
*/
int maxProfit(vector<int>& prices) {
if(prices.size()<2) return 0;
int ans = 0;
int min_price = 0, max_price = 0;
if(prices[1]>prices[0]) min_price = prices[0];
for(int i = 1; i<prices.size()-1; i++){
if(prices[i-1]>=prices[i] && prices[i+1]>prices[i]){
min_price = prices[i];
}
if(prices[i-1]<prices[i] && prices[i+1]<=prices[i]){
max_price = prices[i];
ans += (max_price - min_price);
}
}
if(prices[prices.size()-1]>prices[prices.size()-2]){
max_price = prices[prices.size()-1];
ans += (max_price - min_price);
}
return ans;
}
};
方法二:简化版
class Solution {
public:
/*
买卖股票的最佳时机:可以尽可能地完成更多的交易;
方法二:可以将价格绘制出来,只要上涨就记录收益,下跌时不管
*/
int maxProfit(vector<int>& prices) {
int all_profit = 0;
for(int i=1;i<prices.size();i++){
if(prices[i]-prices[i-1]>0) all_profit += prices[i]-prices[i-1];
}
return all_profit;
}
};