Ответ
Системный подход состоит из последовательных шагов:
1. Уточнение задачи и анализ требований:
- Вход/Выход: Четко определите формат входных данных и ожидаемый результат.
- Крайние случаи: Спросите про пустой ввод, отрицательные числа, дубликаты, очень большие данные.
- Ограничения: Уточните допустимые диапазоны (размер массива, значения).
2. Разработка подхода (алгоритмическое мышление):
- Brute force: Начните с простейшего, но рабочего решения для понимания задачи.
- Оптимизация: Определите "узкое место" и подберите подходящую структуру данных (хеш-таблица, стек, куча) или алгоритмический паттерн (два указателя, sliding window, динамическое программирование).
- Сложность: Оцените временную (
O(n),O(n log n),O(n²)) и пространственную сложность.
3. Реализация и кодирование:
- Пишите чистый, модульный код. Называйте переменные осмысленно.
- Комментируйте неочевидные части логики.
4. Тестирование:
- Базовый сценарий: Простой пример из условия.
- Крайние случаи: Пустые данные, один элемент, отсортированный/несортированный ввод.
- Большие данные: Мысленно проверьте, не упрется ли алгоритм в ограничения.
Пример: Поиск пары чисел с заданной суммой.
// Подход 1: Brute Force (O(n²))
public int[] findPairBruteForce(int[] nums, int target) {
for (int i = 0; i < nums.length; i++) {
for (int j = i + 1; j < nums.length; j++) {
if (nums[i] + nums[j] == target) {
return new int[]{i, j};
}
}
}
return new int[0];
}
// Подход 2: Оптимизация с хеш-таблицей (O(n))
public int[] findPairOptimized(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>(); // число -> его индекс
for (int i = 0; i < nums.length; i++) {
int complement = target - nums[i];
if (map.containsKey(complement)) {
return new int[]{map.get(complement), i};
}
map.put(nums[i], i);
}
return new int[0];
}
Вывод: Второй подход эффективнее для больших массивов, так как поиск в HashMap занимает O(1) в среднем.