Esta imagen puede servir para entender el problema
El sombreado azul representa la cantidad de agua, y esta es el área que hay que hallar. Se multiplica el área del mas bajo (7) por la distancia entre los dos (7):
7 * 7 = 49
Introducción
Arrays y Strings para resolver algoritmos avanzados
Arrays y Strings en detalle
Dos Apuntadores
Patrón de Dos Apuntadores
Verifying Alien Dictionary: análisis del problema
Solución de Verifying Alien Dictionary
Playground: Verifying Alien Dictionary
Programando Verifying Alien Dictionary con JavaScript
Merge Two Sorted Lists: análisis del problema
Solución de Merge Two Sorted Lists
Playground: Merge Two Sorted Lists
Programando Merge Two Sorted Lists con Python
Container With Most Water: análisis del problema
Solución de Container With Most Water
Playground: Container with Most Water
Programando Container With Most Water con Java
Reto: Trapping Rain Water
Ejercicios recomendados de Dos Apuntadores
Ejercicios resueltos de Dos Apuntadores
Ventana Deslizante
Patrón de Ventana Deslizante
Longest Substring Without Repeating Characters: análisis del problema
Solución de Longest Substring Without Repeating Characters
Playground: Longest Substring Without Repeating Characters
Programando Longest Substring Without Repeating Characters con Python
Ejercicios recomendados de Ventana Deslizante
Ejercicios resueltos de Ventana Deslizante
Búsqueda Binaria
Algoritmo de Búsqueda Binaria
Search in Rotated Arrays: análisis del problema
Solución de Search in Rotated Arrays
Playground: Search in Rotated Arrays
Programando Search in Rotated Arrays
Search 2D Array Matrix: análisis del problema
Solución de Search 2D Array Matrix
Playground: Search 2D Array Matrix
Programando Search 2D Array Matrix
Próximos pasos
Toma el Curso Avanzado de Algoritmos: Estructuras de Datos Lineales
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
Aportes 10
Preguntas 0
Esta imagen puede servir para entender el problema
El sombreado azul representa la cantidad de agua, y esta es el área que hay que hallar. Se multiplica el área del mas bajo (7) por la distancia entre los dos (7):
7 * 7 = 49
Mi solucion despues de muchas horas de estar intentando resolver otro algoritmo que de plano no iba a funcionar 😦
/**
water
Cuando yo era estudiante de ingeniería mecánica, este problema se solucionaba con integrales. La matemática booleana y la programación lo hacen ver tan fácil que es impresionante.
De verdad los computadores, son un invento de la humanidad al mismo nivel de la rueda, diría yo que incluso más.
En mi caso no entendí a la primera, decidí analizarlo un poco 😃
En otras palabras cada línea representa una pared del contenedor, y el área formada por el contenedor se puede calcular como el producto de distancia entre las líneas y la altura de la línea más baja.
En el ejemplo [1,8,6,2,5,4,8,3,7], comparan 8 y 7, su distancia la vemos de índice 1 al índice 8, por lo cual su distancia es 7, mientras que altura sería la más baja que es 7. Multiplicando 7 * 7 = 49.
El área formada por el contenedor depende tanto de la altura de las líneas como de la distancia entre ellas. En el caso de las líneas de altura 8 y 7, aunque su altura no es la máxima posible, la distancia entre ellas es la mayor de todas las combinaciones posibles, lo que resulta en un área mayor.
Mi primera solución en Java:
public class ContainerWithMostWater {
public static int containerWithMostWater(int[] alturas) {
int areaMax = 0;
for (int i = 0; i < alturas.length; i++) {
for (int j = 0; j < alturas.length; j++) {
if (i != j) {
int altura = Math.min(alturas[i], alturas[j]);
int ancho = j - i;
int area = altura * ancho;
if (area > areaMax) {
areaMax = area;
}
}
}
}
return areaMax;
}
public static void main(String[] args) {
int[] alturas = {1, 8, 6, 2, 5, 4, 8, 3, 7};
int areaMax = containerWithMostWater(alturas);
System.out.println(areaMax);
}
}
Mi primera solución:
function getContainerCapacity (numbers, size) {
/*
T = O(n)
S = O(1)
*/
let maxNumber = 0
let previousNumber = 0;
let capacityContainer;
for (let i = 1; i < size; i++){
if(numbers[i] > numbers[i - 1] && numbers[i] >= maxNumber) {
if(i <= 1){
previousNumber = numbers[i-1];
} else {
previousNumber = numbers[i-1] <= previousNumber ? maxNumber : numbers[i-1];
}
maxNumber = numbers[i];
} else if (numbers[i] < numbers[i - 1] && i == 1){
maxNumber = numbers[i-1];
previousNumber = numbers[i];
}
if(previousNumber != 0 && numbers[i] != maxNumber && numbers[i] > previousNumber){
previousNumber = numbers[i];
}
}
capacityContainer = previousNumber * previousNumber;
return `The capacity of this container is: ${capacityContainer} liters`;
}
function getRandomArray (size) {
if(typeof size != "number") return "Debes ingresar un número";
const array = new Array(size)
for (let i=0; i<size; i++) {
array[i] = Math.floor(Math.random() * 100);
}
return array;
}
const arr = getRandomArray(10);
console.log(arr);
console.log(getContainerCapacity(arr, arr.length));
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?