算法–两数之和
题目:
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
方法1:
先对数组进行排序, 然后遍历数组
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> result;
int length = nums.size();
map<int, vector<int>> numMap;
for(int i = 0; i < length; i++ ){
numMap[nums[i]].push_back(i);
}
sort(nums.begin(), nums.end(), cmp);
for(int i = 0, j = length -1; i < length;){
if (nums[i] + nums[j] == target){
result.push_back((numMap[nums[i]][0]));
result.push_back((numMap[nums[j]][numMap[nums[j]].size() -1]));
break;
}else if(nums[i] + nums[j] > target){
j --;
}else{
i ++;
}
}
return result;
}
static bool cmp(int a, int b){
return a < b;
}
};
方法2:
暴力法:两次遍历数组
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> result;
for(int i = 0; i< nums.size(); i++){
for(int j=i+1;j < nums.size(); j++){
if (nums[i] + nums[j] == target){
result.push_back(i);
result.push_back(j);
break;
}
}
}
return result;
}
};
方法3:
两次哈希
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> result;
map<int, int> numsMap;
for(int i = 0; i< nums.size(); i++){
numsMap[nums[i]] = i;
}
for(int i = 0; i< nums.size(); i++){
int temp = target - nums[i];
if(numsMap.find(temp) != numsMap.end() && numsMap[temp] != i){
result.push_back(i);
result.push_back(numsMap[temp]);
break;
}
}
return result;
}
};
方法4:
单次哈希
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> result;
map<int, int> numsMap;
for(int i = 0; i< nums.size(); i++){
int temp = target - nums[i];
if(numsMap.find(temp) != numsMap.end() && numsMap[temp] != i){
result.push_back(numsMap[temp]);
result.push_back(i);
break;
}
numsMap[nums[i]] = i;
}
return result;
}
};