leetCode 122. Melhor momento para comprar e vender ações II Algoritmo Ganancioso

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:// icon-default.png?t=N7T8blog .csdn.net/weixin_41987016/article/details/133432053?spm=1001.2014.3001.5501

Artigos e vídeos de referência e recomendados:

Algoritmos gananciosos também podem resolver o problema do estoque! LeetCode: 122. O melhor momento para comprar e vender ações II_bilibili_bilibili

Registro aleatório de código (programmercarl.com)

Capturas de tela das aulas do Code Caprice:

Acho que você gosta

Origin blog.csdn.net/weixin_41987016/article/details/133500827
Recomendado
Clasificación