跟小马哥刷LeetCode算法。这边是小马哥的专栏——马志峰的编程笔记
题目 leetcode_01
题目是在一个给定的整型数组和一个整数,在数组中找到两个数使得他们的和等于给定的整数,并返回下标。
解体思路
之前的思路就是两个循环,然后设置条件如果nums[i] + nums[j] == target就把两个数的下标返回出来。
代码如下
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> r;
auto isize = nums.size();
for(int i = 0; i<isize-1; ++i)
{
for(int j = i+1; j<isize; ++j)
{
if(nums[i] + nums[j] == target)
{
r.push_back(i);
r.push_back(j);
return r;
}
}
}
return r;
}
};
}
另外还有一种思路,在C++中有一个关联容器是map,他可以存两个数据,正好对应题目中的数跟下表i。所以只要验证数组中是否存在一个数等于target - nums[i]就可以了。但是要考虑的是会存在一种情况就是当target = 2*nums[i]的情况,比如数组中有(3,2,4)target为6,那么可能会出现3+3这种情况这个是要排除的。
if(twoSum_map.find(key) != twoSum_map.end() && twoSum_map[key] != i)//将另外一种情况加入判断语句。
代码如下:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> r;
map<int, int> twoSum_map;
auto isize = nums.size();
for(auto i=0; i<isize; ++i)
twoSum_map.insert(pair<int,int>(nums[i],i)); //将数组存入到map容器中
for(auto i=0; i<isize; ++i)
{
auto key = target - nums[i];
if(twoSum_map.find(key) != twoSum_map.end() && twoSum_map[key] != i)
{
r.push_back(i);
r.push_back(twoSum_map[key]);
return r;
}
}
return r;
}
};