Introducción

1

Arrays y Strings para resolver algoritmos avanzados

2

Arrays y Strings en detalle

Dos Apuntadores

3

Patrón de Dos Apuntadores

4

Verifying Alien Dictionary: análisis del problema

5

Solución de Verifying Alien Dictionary

6

Playground: Verifying Alien Dictionary

7

Programando Verifying Alien Dictionary con JavaScript

8

Merge Two Sorted Lists: análisis del problema

9

Solución de Merge Two Sorted Lists

10

Playground: Merge Two Sorted Lists

11

Programando Merge Two Sorted Lists con Python

12

Container With Most Water: análisis del problema

13

Solución de Container With Most Water

14

Playground: Container with Most Water

15

Programando Container With Most Water con Java

16

Reto: Trapping Rain Water

17

Ejercicios recomendados de Dos Apuntadores

18

Ejercicios resueltos de Dos Apuntadores

Ventana Deslizante

19

Patrón de Ventana Deslizante

20

Longest Substring Without Repeating Characters: análisis del problema

21

Solución de Longest Substring Without Repeating Characters

22

Playground: Longest Substring Without Repeating Characters

23

Programando Longest Substring Without Repeating Characters con Python

24

Ejercicios recomendados de Ventana Deslizante

25

Ejercicios resueltos de Ventana Deslizante

Búsqueda Binaria

26

Algoritmo de Búsqueda Binaria

27

Search in Rotated Arrays: análisis del problema

28

Solución de Search in Rotated Arrays

29

Playground: Search in Rotated Arrays

30

Programando Search in Rotated Arrays

31

Search 2D Array Matrix: análisis del problema

32

Solución de Search 2D Array Matrix

33

Playground: Search 2D Array Matrix

34

Programando Search 2D Array Matrix

Próximos pasos

35

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

Container With Most Water: análisis del problema

12/35
Recursos

Aportes 10

Preguntas 0

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

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

Lo logre solucionar, creo mi solución tiene una dificulta de O(n\*2), no la pude hacer lineal, de un solo ciclo, pero la clave esta en entender que el problema es rectangulo, y toca calcular base x altura y sacar el area. Las alturas son los valores de la lista y la base son los indices de la lista. Lo importante es la altura y encontrar una altura igual o superior y sacar el area del rectangulao. Ejmplo si la altura es 1 y la siguiente altura es 8. entonces altura = 1 y base = 1 y el area seria = 1. En forma decendente seria asi. Altura 7 y la siguiente altura mas alta seria 8 y el 8 esta en el indice 2, seri altura = 7 base = 2, area = 14. El siguiente 8 esta en el 7 y seria altura 7 base 7, area igual a 49. ![](https://static.platzi.com/media/user_upload/05-75232eb1-41a6-4c89-bdeb-30baf0963308.jpg)
```c# #include <iostream> using namespace std; int main() { int array[] = {1,8,6,2,5,4,8,3,7}; int longitud = sizeof(array)/sizeof(array[0]); int maximo = 0; for (int i = 0; i < longitud; i++) { int elemento1 = array[i]; for (int j = i + 1; j <= longitud; j++) { int elemento2 = array[j]; int base = j - i; int area; if (elemento2 < elemento1) { area = base * elemento2; } else { area = base * elemento1; }#include <iostream> using namespace std; int main() { int array[] = {1,8,6,2,5,4,8,3,7}; int longitud = sizeof(array)/sizeof(array[0]); int maximo = 0; for (int i = 0; i < longitud; i++) { int elemento1 = array[i]; for (int j = i + 1; j <= longitud; j++) { int elemento2 = array[j]; int base = j - i; int area; if (elemento2 < elemento1) { area = base * elemento2; } else { area = base * elemento1; } //cout << i << " " << j << ": " << area << endl; if (area > maximo) { maximo = area; } } } cout << maximo << endl; return 0; } //cout << i << " " << j << ": " << area << endl; if (area > maximo) { maximo = area; } } } cout << maximo << endl; return 0; } ```
no entendi este problema
Pues me costo más de 15 minutos para poder plantear una solución. Al final la solución que implementé fue hacer una comparación del primer elemento con sus siguientes elementos e ir registrando el área. A pesar de que solo utilizo un ciclo creo que en cuanto a tiempo sería de n^2, esto por la cantidad de iteraciones que hago sobre la lista. Aquí dejo mi solución en JSconst getBiggestLines = (lines) => { let firstPointer = 0; let lastPointer = lines.length - 1; let biggestArea = 0; while (firstPointer < lines.length - 1) { if (lastPointer - firstPointer === 1) { lastPointer = lines.length - 1; firstPointer += 1; } else { const firstLine = lines\[firstPointer]; const lastLine = lines\[lastPointer]; const area = Math.min(firstLine, lastLine) \* (lastPointer - firstPointer); if(area > biggestArea) { biggestArea = area; } lastPointer -= 1; } } return biggestArea; };: ```js const getBiggestLines = (lines) => { let firstPointer = 0; let lastPointer = lines.length - 1; let biggestArea = 0; while (firstPointer < lines.length - 1) { if (lastPointer - firstPointer === 1) { lastPointer = lines.length - 1; firstPointer += 1; } else { const firstLine = lines[firstPointer]; const lastLine = lines[lastPointer]; const area = Math.min(firstLine, lastLine) * (lastPointer - firstPointer); if(area > biggestArea) { biggestArea = area; } lastPointer -= 1; } } return biggestArea; }; ```

Mi solucion despues de muchas horas de estar intentando resolver otro algoritmo que de plano no iba a funcionar 😦

/**

  • Two pointers (p1, p2), one at the start, one at the end.
    • Calculate the water with distance (p2-p1) minus minum height. Save result in water
    • if the two values are the same, move pointers (p1++) (p2–)
    • if not, move the pointer of the minimum height
    • if two pointers are the same value (points to the same value), finish the execution.
      */

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