Решение задачи двух сумм на C++: раскрыты различные подходы!

Задача о двух суммах – это классическая алгоритмическая задача, которая предполагает нахождение в массиве двух чисел, сумма которых равна заданному целевому значению. В этой статье блога мы рассмотрим несколько методов решения этой проблемы с помощью C++. Мы будем использовать непринужденный и простой для понимания язык вместе с примерами кода, чтобы помочь вам освоить каждый подход. Итак, давайте углубимся и разгадаем секреты решения задачи о двух суммах!

Метод 1: подход грубой силы
Подход грубой силы — это самый простой метод решения проблемы двух сумм. Он включает в себя вложенные циклы, которые перебирают массив для проверки всех возможных пар чисел. Вот фрагмент кода C++ для этого подхода:

#include <vector>
std::vector<int> twoSum(std::vector<int>& nums, int target) {
    int n = nums.size();
    for (int i = 0; i < n; i++) {
        for (int j = i + 1; j < n; j++) {
            if (nums[i] + nums[j] == target) {
                return {i, j};
            }
        }
    }
    return {}; // No solution found
}

Метод 2: использование хэш-карты
Другой эффективный подход к решению проблемы двух сумм включает использование хеш-карты (unordered_map в C++). Мы будем перебирать массив, сохраняя индекс каждого числа в хеш-карте. Во время итерации мы также проверим, существует ли дополнение текущего числа (цель минус текущее число) в хеш-карте. Вот фрагмент кода C++ для этого подхода:

#include <vector>
#include <unordered_map>
std::vector<int> twoSum(std::vector<int>& nums, int target) {
    std::unordered_map<int, int> map;
    for (int i = 0; i < nums.size(); i++) {
        int complement = target - nums[i];
        if (map.count(complement)) {
            return {map[complement], i};
        }
        map[nums[i]] = i;
    }
    return {}; // No solution found
}

Метод 3: сортировка и два указателя
Если массив отсортирован, мы можем использовать метод двух указателей для эффективного решения проблемы двух сумм. Мы будем поддерживать два указателя: один в начале, а другой в конце массива. Сравнивая сумму указанных элементов с целью, мы можем сузить поиск. Вот фрагмент кода C++ для этого подхода:

#include <vector>
#include <algorithm>
std::vector<int> twoSum(std::vector<int>& nums, int target) {
    int left = 0;
    int right = nums.size() - 1;
    while (left < right) {
        int sum = nums[left] + nums[right];
        if (sum == target) {
            return {left, right};
        }
        if (sum < target) {
            left++;
        } else {
            right--;
        }
    }
    return {}; // No solution found
}

В этой статье блога мы рассмотрели три различных метода решения проблемы двух сумм в C++. Мы обсудили подход грубой силы, подход хэш-карты, а также метод сортировки и двухуказателей. В зависимости от конкретных требований и ограничений вашей задачи вы можете выбрать наиболее подходящий метод для эффективного решения проблемы двух сумм.