-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathaula24.java
65 lines (57 loc) · 3.23 KB
/
aula24.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
class aula24{ // Declaração da classe chamada 'aula24'
static int MAX = 1000; // Declaração de uma variável estática 'MAX' com valor 1000
// Método que retorna o índice do próximo maior elemento à esquerda para cada elemento de um array
static int[] nextGreaterInLeft(int []a, int n)
{
int []left_index = new int[MAX]; // Cria um novo array 'left_index' de tamanho 'MAX'
java.util.Stack<Integer> s = new java.util.Stack<Integer>(); // Cria uma nova pilha 's'
// Loop que percorre o array 'a' de trás para frente
for(int i = n -1; i >= 0; i--)
{
// Enquanto a pilha não estiver vazia e o elemento atual for maior que o elemento no topo da pilha
while (s.size() != 0 && a[i] > a[s.peek() -1]) {
int r = s.peek(); // Pega o elemento no topo da pilha
s.pop(); // Remove o elemento no topo da pilha
left_index[r -1] = i + 1; // Atualiza o índice do próximo maior elemento à esquerda
}
s.push(i + 1); // Adiciona o índice atual (incrementado por 1) à pilha
}
return left_index; // Retorna o array 'left_index'
}
// Método semelhante ao anterior, mas que retorna o índice do próximo maior elemento à direita
static int[] nextGreaterInRight(int []a, int n)
{
int []right_index = new int[MAX]; // Cria um novo array 'right_index' de tamanho 'MAX'
java.util.Stack<Integer> s = new java.util.Stack<Integer>(); // Cria uma nova pilha 's'
// Loop que percorre o array 'a' da esquerda para a direita
for(int i = 0; i < n; ++i){
// Enquanto a pilha não estiver vazia e o elemento atual for maior que o elemento no topo da pilha
while (s.size() != 0 && a[i] > a[s.peek() -1]) {
int r = s.peek(); // Pega o elemento no topo da pilha
s.pop(); // Remove o elemento no topo da pilha
right_index[r -1] = i + 1; // Atualiza o índice do próximo maior elemento à direita
}
s.push(i + 1); // Adiciona o índice atual (incrementado por 1) à pilha
}
return right_index; // Retorna o array 'right_index'
}
// Método que retorna o produto máximo dos índices dos próximos maiores elementos à esquerda e à direita
static int LRProduct(int []arr, int n)
{
int []left = nextGreaterInLeft(arr, n); // Obtém os índices dos próximos maiores elementos à esquerda
int []right = nextGreaterInRight(arr, n); // Obtém os índices dos próximos maiores elementos à direita
int ans = -1; // Inicializa a resposta como -1
// Loop que percorre os arrays 'left' e 'right'
for(int i = 0; i < n; i++)
{
ans = Math.max(ans, left[i]* right[i]); // Atualiza a resposta com o produto máximo
}
return ans; // Retorna a resposta
}
// Método principal que é executado quando o programa é iniciado
public static void main(String[] args) {
int []arr = new int[]{5, 4, 3, 4, 5}; // Cria um array 'arr'
int n = arr.length; // Obtém o tamanho do array
System.out.print(LRProduct(arr, n)); // Imprime o produto máximo retornado pelo método 'LRProduct'
}
}