1、两数之和
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
解法一、暴力解
两边遍历查找是否有相应元素
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
int len = nums.size();
int i,j;
for (i =0; i< len-1; i++){
for(j =i+1;j<len;j++){
if (nums[i] + nums[j] == target)
return {i,j} ;
}
}
return {0};
}
};
解法二、哈希表
因为两边遍历使得算法复杂度为O(n2),采用哈希表遍历一次,降为O(n)
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
map<int,int> map_a;//构建hash
vector<int> res(2);//result
for(int i=0; i<nums.size(); i++){
int temp = target - nums[i];
if(map_a.count(temp)){
res[0] = i;
res[1] = map_a[temp];
break;
}
map_a[nums[i]] = i;
}
return res;
}
};
补充,c++中map的两个方法
1、使用count,返回的是被查找元素的个数。如果有,返回1;否则,返回0。注意,map中不存在相同元素,所以返回值只能是1或0。
2、使用find,返回的是被查找元素的位置,没有则返回map.end()。