1. Two Sum

 

Given an array of integers, find two numbers such that they add up to a specific target number.

The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. Please note that your returned answers (both index1 and index2) are not zero-based.

You may assume that each input would have exactly one solution.

Input: numbers = {2, 7, 11, 15}, target = 9

Output: index1 = 1, index2 = 2

 

 

1. Две суммы

 

Задан массив целых чисел. Найдите два числа, сумма которых равна заданному числу.

Функция twoSum должна вернуть индексы таких двух чисел, сумма которых равна target, где index1 должен быть меньше index2. Возвращаемые значения (и index1 и index2) должны быть ненулевыми.

Считайте, что для заданных входных данных имеется в точности одно решение.

Вход: numbers = {2, 7, 11, 15}, target = 9

Выход: index1 = 1, index2 = 2

 

class Solution {

public:

  vector<int> twoSum(vector<int>& nums, int target) {

        

  }

};

 

 

РЕШЕНИЕ

последовательности

 

Анализ алгоритма

Можно воспользоваться двумя циклами, перебрав все пары индексов. Получим решение за O(n2).

Рассмотрим массив структур из двух элементов – вместе с числами будем хранить их индексы в исходном масиве. Отсортируем его. Далее воспользуемся двумя указателями, двигающимися с краев внутрь. За O(nlog2n) задача будет решена.

 

Реализация алгоритма

 

class Solution

{

public:

  vector<int> twoSum(vector<int> &numbers, int target)

  {

    vector<int> res;

    vector<pair<int,int> > num;

 

Создаем массив с числами и соответствующими индексами.

 

    for(int i = 0; i < numbers.size(); i++)

      num.push_back(make_pair(numbers[i],i+1));

 

Сортируем массив.

 

    sort(num.begin(),num.end());

 

Инициализируем указатели: i устанавливаем на начало массива (нулевой элемент), j на конец массива (последний элемент).

 

    int i = 0, j = num.size() - 1;

    while(i < j)

    {

 

Если сумма чисел, на которые указывают i и j, равна target, то искомая пара чисел найдена. Создаем и сортируем пару индексов.

 

      if (num[i].first + num[j].first == target)

      {

        res.push_back(num[i].second);

        res.push_back(num[j].second);

        sort(res.begin(),res.end());

        return res;

      }

 

Если сумма меньше target, то двигаем вправо левый указатель. Если сумма больше target, то двигаем влево правый указатель.

 

      else if (num[i].first + num[j].first < target) i++; else j--;

    }

 

    return res;

  }

};