🍭Если мы имеем дело с верхними/максимальными/минимальными/ближайшими «K» элементами среди «N» элементов, мы будем использовать кучу.

🍭Если данный вход представляет собой отсортированный массив или список, мы будем использовать либо Двоичный поиск, либо Два указателя.

🍭Если нам нужно попробовать все комбинации (или перестановки) входных данных, мы можем использовать отслеживание с возвратом или поиск в ширину.

🍭Большинство вопросов, связанных с деревьями или графами, можно решить с помощью поиска в ширину или поиска в глубину. .

🍭Каждое рекурсивное решение можно преобразовать в итеративное решение с помощью стека.

🍭Для задачи, связанной с массивами, если существует решение за время O(n²) и пространство O(1), должны существовать два других решения:
1. Использование HashMap или Установите для O(n) времени и O(n) пространства.
2. Использование сортировки для O(n log n) времени и O(1) пространства.

🍭 Если проблема требует оптимизации (например, максимизации или минимизации), мы будем использовать динамическое программирование.

🍭Если нам нужно найти некоторую общую подстроку среди набора строк, мы будем использовать HashMap или Trie.

🍭Если нам нужно искать/манипулировать набором строк, Trie будет лучшей структурой данных.

🍭Если проблема связана с LinkedList и мы не можем использовать дополнительное пространство, используйте подход Fast & Slow Pointer.