Получен массив целых чисел nums
и целочисленное число target
.
Нужно вернуть индексы двух чисел, сумма которых равна target
.
Предполагается, что входные данные таковы, что решение точно есть. Один и тот же элемент нельзя использовать дважды.
Нужно вернуть ответ в любом случае.
Входные данные: nums = [2,7,11,15], target = 9
Результат: [0,1]
Пояснение: Так как nums[0] + nums[1] == 9, возвращается [0, 1].
Входные данные: nums = [3,2,4], target = 6
Результат: [1,2]
Входные данные: nums = [3,3], target = 6
Результат: [0,1]
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
for(int i = 0; i < nums.size(); i++) {
for(int j = i+1; j < nums.size(); j++) {
if(nums[i] + nums[j] == target) {
return {i, j};
}
}
}
return {};
}
}
Используется метод двух указателей (см.ниже). Для этого полученный вектор копируется, копия сортируется (копия также содержит индексы исходного вектора).
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<pair<int,int>> temp;
for(int i=0;i<nums.size();i++){
temp.push_back({nums[i],i});
}
sort(temp.begin(),temp.end());
int x=0,y=nums.size()-1;
while(x<y){
int sum=temp[x].first+temp[y].first;
if(sum==target)
return {temp[x].second,temp[y].second};
else if(sum<target)
x++;
else{
y--;
}
}
return {-1,-1};
}
};
Метод двух указателей используется, когда массив упорядочен. Сначала левый указатель указывает на начало массива, а правый на его конец. Если их сумма равна целевому значению, то мы выходим, если нет, то:
если сумма больше целевого значения, то нам нужна меньшая сумма (логично, да?) и мы сдвигаем левее правый указатель
если сумма меньше целевого значения, то мы сдвигаем левый указатель, чтобы её увеличить