两数之和
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
1. 解法一:暴力枚举O(n^2)
没啥好说的,两重循环
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> res;
if(nums.size() == 2) {
res.push_back(0);
res.push_back(1);
return res;
}
for(int i=0;i<nums.size();i++)
for(int j=i+1;j<nums.size();j++)
if(nums[j] == target-nums[i]) {
res.push_back(i);
res.push_back(j);
return res;
}
return res;
}
};
运行结果:
2. 解法二:双指针O(nlogn)
sort()排序,双指针确定两个值,顺序遍历查找位置。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> res;
vector<int> temp = nums;
map<int,int> mp;
sort(temp.begin(),temp.end());
int l = 0, r = temp.size()-1, x = 0 ,y = 0;
while(l<r) {
if(temp[l] + temp[r] == target) {
x = temp[l], y = temp[r];
break;
}else if(temp[l] + temp[r] > target) {
r --;
}else l ++;
}
for(int i=0;i<nums.size();i++)
if(nums[i] == x || nums[i] == y) res.push_back(i);
return res;
}
};
3. 解法三:哈希表O(n)
用unordered_map建立全数组哈希值表,注意为避免处理0,对应nums[i]对应value为i+1。
注意
C++中map有三种:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int,int> hashmp;
vector<int> res;
int x=0,y=0;
for(int i=0;i<nums.size();i++) {
if(hashmp[target-nums[i]] && hashmp[target-nums[i]]!=i+1) {
res.push_back(i);
res.push_back(hashmp[target-nums[i]]-1);
break;
}else {
hashmp[nums[i]] = i+1;
}
}
sort(res.begin(),res.end());
return res;
}
};
运行结果: