Likou Solution Summary 2049 - Conte o número de nós com a pontuação mais alta

Link do título original: force fivela


descrever:

Você recebe uma árvore binária com um nó raiz de 0, que tem um total de n nós, e os nós são numerados de 0 a n - 1. Também fornece uma matriz inteira baseada em 0 pais representando a árvore, onde pais[i] é o pai do nó i. Como o nó 0 é a raiz, os pais[0] == -1 .

O tamanho de uma subárvore é o número de nós na subárvore. Cada nó tem uma pontuação associada a ele. O método para encontrar a pontuação de um nó é excluir todos os nós e as arestas conectadas a ele, e a parte restante são várias subárvores não vazias, e a pontuação desse nó é o produto dos tamanhos de todas essas subárvores.

Por favor, retorne o número de nós com a pontuação mais alta.

Exemplo 1:

Entrada: pais = [-1,2,0,2,0]
Saída: 3
Explicação:
- A pontuação do nó 0 é: 3 * 1 = 3
- A pontuação do nó 1 é: 4 = 4
- A pontuação do nó 2 é: 1 * 1 * 2 = 2
- A pontuação do nó 3 é: 4 = 4
- A pontuação do nó 4 é: 4 = 4 A
pontuação mais alta é 4 e há três nós que pontuam 4 (nós 1, 3 e 4).
Exemplo 2:

Entrada: pais = [-1,2,0]
Saída: 2
Explicação:
- A pontuação do nó 0 é: 2 = 2
- A pontuação do nó 1 é: 2 = 2
- A pontuação do nó 2 é: 1 * 1 = 1
mais alto Com uma pontuação de 2, existem dois nós com pontuação 2 (nós 0 e 1).
 

dica:

n == pais.comprimento
2 <= n <= 105
pais[0] == -1
para i != 0 , existem 0 <= pais[i] <= n - 1
pais representam uma árvore binária.

Fonte: LeetCode
Link: https://leetcode-cn.com/problems/count-nodes-with-the-highest-score Os
direitos autorais pertencem a Leetcode.com. Para reimpressões comerciais, entre em contato com a autorização oficial e, para reimpressões não comerciais, indique a fonte.

Ideias para resolução de problemas:

* Idéias para solução de problemas: 
* O comprimento desta questão é 10^5, então a complexidade de tempo não deve exceder O(NlgN), e o objetivo é aproximar-se de O(N). 
* Minha ideia é construir um nó Node um por um, cada nó contém o id de left, right, parent, e o número de leftNum e rightNum. 
* Na primeira etapa, construímos todos os nós e os registramos com o mapa. É conveniente encontrar o nó de acordo com o id. 
* Na segunda etapa, percorremos a matriz, atribuímos valores à esquerda e à direita do parentNode de acordo com o pai e atribuímos valores ao pai do nó do nó. 
* A terceira etapa é percorrer recursivamente do nó raiz para encontrar o número de nós esquerdos leftNum e o número de nós direitos rightNum. Se leftNum>0 de um nó, isso prova que o cálculo foi feito e não há necessidade de repetir o cálculo. Na verdade, não deve haver cena de cálculo repetido, afinal, ela é ordenada de cima para baixo. 
* Na quarta etapa, percorra o array novamente. Obtenha o nó do nó correspondente. Como temos seu leftNum, rightNum, parentNum pode ser calculado. Então value=leftNum*rightNum*parentNum; 
* Etapa 5, se valor>maxvalue, então maxvaluenum=1. maxvaluenum++ se valor==maxvalue. Finalmente retorne maxvaluenum

Código:

public class Solution2049 {

    public int countHighestScoreNodes(int[] parents) {
        Map<Integer, Node> map = new HashMap<>();//1,2
        for (int i = 0; i < parents.length; i++) {
            Node node = new Node();
            node.value = i;
            map.put(i, node);
        }
        for (int i = 0; i < parents.length; i++) {
            int parent = parents[i];
            Node parentNode = map.get(parent);
            if (parentNode == null) {
                continue;
            }
            if (parentNode.left == -1) {
                parentNode.left = i;
                continue;
            }
            parentNode.right = i;

            Node node = map.get(i);
            node.parent = parent;
        }
        int num = searchList(map.get(0), map);
        long maxValue = 0;
        int maxValueNum = 0;
        for (int i = 0; i < parents.length; i++) {
            Node node = map.get(i);
            long leftNum = node.leftNum;
            long rightNum = node.rightNum;
            long topNum = num - leftNum - rightNum - 1;
            topNum = topNum == 0 ? 1 : topNum;
            leftNum = leftNum == 0 ? 1 : leftNum;
            rightNum = rightNum == 0 ? 1 : rightNum;
            long value = leftNum * rightNum * topNum;
            if (value > maxValue) {
                maxValueNum = 1;
                maxValue = value;
            } else if (value == maxValue) {
                maxValueNum++;
            }
        }
        return maxValueNum;
    }

    private int searchList(Node node, Map<Integer, Node> map) {
        int leftNum = 0;
        int rightNum = 0;
        if (node.left >= 0) {
            if (node.leftNum > 0) {
                leftNum = node.leftNum;
            } else {
                leftNum = searchList(map.get(node.left), map);
            }
        }
        if (node.right >= 0) {
            if (node.rightNum > 0) {
                rightNum = node.rightNum;
            } else {
                rightNum = searchList(map.get(node.right), map);
            }
        }
        node.leftNum = leftNum;
        node.rightNum = rightNum;
        return leftNum + rightNum + 1;
    }


    static class Node {
        int value = -1;
        int leftNum = 0;
        int rightNum = 0;
        int parent = -1;
        int left = -1;
        int right = -1;

    }

}

Acho que você gosta

Origin blog.csdn.net/AA5279AA/article/details/123420565
Recomendado
Clasificación