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