LeetCode: https://leetcode.com/problems/two-sum/

Как решить вышеописанную задачу о двух суммах из Leetcode

Описание:Для массива целых чисел nums и целого числа target вернуть индексы двух чисел так, чтобы их сумма составляла target. Вы можете предположить, что каждый вход будет иметь ровно одно решение, и вы не сможете использовать один и тот же элемент дважды. Вы можете вернуть ответ в любом порядке.

Код:

класс Решение {

public int[] twoSum(int[] nums, int target) {

интервал слева = 0;

int right=nums.length-1;

int[] ans = новый int[2];

в то время как (слева ‹ справа) {

int sum = nums[left] + nums[right];

если (сумма == цель) {

ан[0]=слева; ответ[1]=право;

вернуть ответ;

} else if (sum != target && left != right-1) {

верно - ;

продолжать;

} еще {

левый++;

справа = nums.length-1;

}

}

вернуть ответ;

}

}

Решение :

Проблема с вопросом выше заключается в том, что он отличается от традиционного метода двух указателей, поскольку здесь нам сказали вернуть массив индексов, и поскольку мы хотим вернуть индексы, мы не можем отсортировать массив, а традиционный метод двух указателей требует сначала отсортировать массив.

поэтому, чтобы решить проблему с использованием двух указателей, мы сначала берем два указателя: левый, присвоенный 0, а правый, назначенный последнему элементу массива, затем запускаем цикл while, пока левый не станет меньше правого.

  1. в цикле while сначала мы берем сумму левого и правого значений, если сумма равна цели, затем возвращаем левое и правое значения через массив.
  2. иначе, если сумма не равна целевому значению, а левое значение не равно правому-1, тогда мы уменьшали значение правого элемента на 1 в цикле и добавляли к левому, пока их сумма не станет равна целевому значению (что является условием 1.) или правому- 1 не равно левому.
  3. если условие 1 (т.е. nums[left]+nums[right] == ​​target ) не достигается в условии 2 на любом этапе цикла, а также в цикле достигается right-1==left, то мы переназначаем как левую, так и правую значения, увеличиваются влево на 1 и присваиваются справа от последнего индекса массива, после этого цикл повторяется, и условие 2 выполняется до тех пор, пока условие 1 не будет достигнуто.

Примечание. Этот вопрос можно решить, используя более оптимальные методы, такие как хеш-таблицы, но здесь мы сосредоточимся на том, чтобы попытаться решить этот вопрос, используя два указателя.