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;
}
}