1、两数之和:
给定一个整数数组nums和一个目标值target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标,
你可以假设每种输入只会对应一个答案,但是,你不能重复利用这个数组中同样的元素。
例如:输入:nums=[2, 7, 11, 15], target = 9
因为nums[0]+nums[1] = target=9,所以返回[0, 1]
C++暴力法:时间复杂度为O(N^2),空间复杂度为O(1)
class Solution{
public:
vector<int> twosum(vector<int> & nums, int target){
for(int i=0; i<nums.size()-1; i++){
for(int j=i+1; j<nums.size(); j++){
if(nums[i]+nums[j]==target)
return {i, j};
break;
}
}
}
return ;
};
C++STL版本(建立哈希表的方法):时间复杂度为O(n)
class Solution{
public:
vector<int> twosum(vector<int> & nums, target){
vector<int> vi;
map<int, int> a;
for(int i=0; i<nums.size(); i++){
a.insert(map<int, int>::value_type(nums[i], i));
}
for(int i=0; i<nums.size(); i++){
if(a.count(target-nums[i])>0 && a(target-nums[i])!=i){//找到的目标元素还不能是本身的数
vi[0] = i;
vi[1] = a(target-nums[i]);
break;
}
}
}
return vi;
};
C++建哈希表优化:做到在遍历nums时一次将数据存入map而不是遍历两遍。
class Solution{
public:
vector<int> twosum(vector<int> & nums, target){
map<int, int> a;
vector<int> vi;
for(int i=0; i<nums.size(); i++){
if(a.count(target-nums[i]){
vi[0] = a[target-nums[i]];
vi[1] = i;
break;
}
a[nums[i]] = i;//若不满足if条件,则先将此数放入map中保存,进入下一轮判断map中是否已存有此数。
}
return vi;
}
};