Given an array of integers, return indices of the two numbers such that they add up to a specific target.
You may assume that each input would have exactly one solution.
Example:
Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].
法一:两层循环遍历数组:
时间复杂度:O(n*n)
空间复杂度:O(1)
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
int count = nums.size();
vector<int> result;
for(int i = 0; i < count; i++)
for(int j = i + 1; j < count; j++)
if((nums[i] + nums[j]) == target) {
result.push_back(i);
result.push_back(j);
break;
}
return result;
}
};
法二:排序后头尾夹逼查找:
首先对数组进行备份,然后升序排序;采用头尾两指针left和right分别从头尾向中间运动:当left和right位置的两个数字之和小于target时,left加1;当left和right位置的两个数字之和大于target时,right减1;相等时,就找到了
时间复杂度:O(nlogn) (取决于排序时间复杂度)
空间复杂度:O(n) (取决于备份数组的空间复杂度)
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> vec(nums);
sort(vec.begin(), vec.end());
vector<int> result;
int left = 0, right = nums.size() - 1;
while(left < right) {
int res = vec[left] + vec[right];
if (res == target) break;
else if (res < target) left++;
else right--;
}
for(int i = 0, size = 2; i < nums.size(); i++) {
if(vec[left] == nums[i] || vec[right] == nums[i]) {
result.push_back(i);
if(--size == 0)
break;
}
}
return result;
}
};
法三:使用Hash Table作缓存:
时间复杂度:O(n)
空间复杂度:O(n)
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> result;
map<int, int> maps;
int count = nums.size();
for(int i = 0; i < count; i++) {
int complement = target - nums[i];
if(maps.find(complement) != maps.end()) {
result.push_back(maps[complement]);
result.push_back(i);
break;
}
maps[nums[i]] = i;
}
return result;
}
};