122. O melhor momento para comprar e vender ações II - LeetCode
Você recebe uma matriz de números inteiros prices
que prices[i]
representa o preço de uma determinada ação no i
dia 1.
Em cada dia, você pode decidir se deseja comprar e/ou vender ações . Você só pode manter no máximo uma ação por vez . Você também pode comprar primeiro e depois vender no mesmo dia .
Retorne o lucro máximo que você pode obter .
Exemplo 1:
Entrada: preços = [7,1,5,3,6,4] Saída: 7 Explicação: Compre no dia 2 (preço da ação = 1) e venda no dia 3 (preço da ação = 5) Fora, o lucro desta transação = 5 - 1 = 4. Posteriormente, se você comprar no 4º dia (preço da ação = 3) e vender no 5º dia (preço da ação = 6), o lucro desta transação = 6 - 3 = 3. O lucro total é 4 + 3 = 7.
Exemplo 2:
Entrada: preços = [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), O lucro desta transação = 5 - 1 = 4. O lucro total é 4.
Exemplo 3:
Entrada: preços = [7,6,4,3,1] Saída: 0 Explicação: Neste caso, a transação não pode obter lucro positivo, então o lucro máximo pode ser obtido não participando da transação, e o lucro máximo é 0.
>>Ideias e análises
- ① Apenas um estoque
- ② Atualmente existem apenas operações de compra ou venda de ações
- ③ Se você quiser obter lucro, pelo menos dois dias devem ser uma unidade de negociação.
1. Algoritmo ganancioso
Vamos dar um exemplo primeiro: por exemplo, se você comprar no primeiro dia (preço da ação = 1) e vender no terceiro dia (preço da ação = 10), o lucro desta transação = 10 - 1 = 9. O lucro é: preços[3] - preços[1]
Equivalente a (preços[3] - preços[2]) + (preços[2] - preços[1])
Neste momento, o lucro é decomposto em dimensões unitárias diárias , em vez de considerá-lo como um todo do dia 1 ao dia 3 !
- Ótimo local : obtenha lucros positivos diários
- Ótimo Global : Encontre o lucro máximo
A otimalidade local pode levar à otimalidade global. Se você não conseguir encontrar um contra-exemplo, tente ser ganancioso!
Nota: Não há lucro no primeiro dia e haverá lucro pelo menos no segundo dia , portanto a sequência de lucro é um dia a menos que a sequência de ações!
Da figura acima, verifica-se que apenas OS lucros diários são recolhidos.O intervalo para recolha de lucros positivos é o intervalo de negociação de ações , pelo que só Precisa de prestar atenção Ao lucro final e não precisa de registar o intervalo. E coletar apenas lucros positivos é onde entra a ganância!
class Solution {
public:
int maxProfit(vector<int>& prices) {
int result = 0;
for (int i = 1; i < prices.size(); i++) {
result += max(prices[i] - prices[i - 1], 0);
}
return result;
}
};
- Complexidade de tempo: O(n)
- Complexidade do espaço: O(1)
2. Programação dinâmica
class Solution {
public:
// 动态规划 + 状态转移 时间复杂度:O(n) 空间复杂度:O(n)
int maxProfit(vector<int>& prices) {
int len = prices.size();
vector<vector<int>> dp(len,vector<int>(2,0));
dp[0][0] -= prices[0];
dp[0][1] = 0;
for(int i = 1;i < len; i++) {
dp[i][0] = max(dp[i-1][0],dp[i-1][1] - prices[i]);
dp[i][1] = max(dp[i-1][1],dp[i-1][0] + prices[i]);
}
return dp[len-1][1];
}
// 动态规划 + 状态转移 时间复杂度:O(n) 空间复杂度:O(1)
int maxProfit(vector<int>& prices) {
int len = prices.size();
vector<vector<int>> dp(2,vector<int>(2));
dp[0][0] -= prices[0];
dp[0][1] = 0;
for(int i = 1;i < len; i++) {
dp[i % 2][0] = max(dp[(i-1) % 2][0],dp[(i-1) % 2][1] - prices[i]);
dp[i % 2][1] = max(dp[(i-1) % 2][1],dp[(i-1) % 2][0] + prices[i]);
}
return dp[(len-1) % 2][1];
}
};
Meus artigos anteriores explicam detalhadamente a programação dinâmica desta questão: leetCode 122. O melhor momento para comprar e vender ações II programação dinâmica + transferência de estado + compressão de estado_Heheda( ̄▽ ̄)"'s blog-CSDN blog https:// blog .csdn.net/weixin_41987016/article/details/133432053?spm=1001.2014.3001.5501
Artigos e vídeos de referência e recomendados:
Registro aleatório de código (programmercarl.com)
Capturas de tela das aulas do Code Caprice: