So I'm trying to solve problem of finding two numbers from an array such that they add up to a specific target number. The simplest way to solve it (it gives TimeLimit Error, because it takes O(n^2) time)
vector<int> res, temp = numbers;
sort(temp.begin(), temp.end());
for (int i = 0; i < numbers.size(); i++)
{
for (int j = i + 1; j < numbers.size(); j++)
{
if (numbers[i] + numbers[j] == target)
{
res.push_back(i + 1);
res.push_back(j + 1);
return res;
}
}
}
Also I've tried to sort array before find and then use two pointers (Now it takes O(n^2 log n) time but still gives me Time Limit Error)
vector<int> twoSum(vector<int> &numbers, int target) {
vector<int> res, temp = numbers;
sort(temp.begin(), temp.end());
int i = 0, j = numbers.size() - 1;
while (i < j)
{
if (temp[i] + temp[j] == target)
{
res.push_back(i);
res.push_back(j);
break;
}
if (temp[i] + temp[j] < target)
i++;
if (temp[i] + temp[j] > target)
j--;
}
for (int i = 0; i < numbers.size(); i++)
{
if (numbers[i] == temp[res[0]])
{
res[0] = i + 1;
break;
}
}
for (int i = 0; i < numbers.size(); i++)
{
if (numbers[i] == temp[res[1]])
{
res[1] = i + 1;
break;
}
}
return res;
}
So I would like to know how it is possible to solve this problem using only O(n) time? I've heard somthing about hash and map but don't know what are they and how to use them.