LeetCode第一题
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
首先自己的笨方法
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> towSum1;
for(int i=0;i<nums.size();i++){
for(int j=0;j<nums.size();j++){
if((nums[i]+nums[j]==target)&i!=j){
towSum1.push_back(i);
towSum1.push_back(j);
return towSum1;
}
}
}
return towSum1;
}
};
时间效率很低,尤其,但是学了vector的相关用法,push_back()插入
以及了解了迭代器的使用
vector<int> vec;
for(vector<int>::iterator iter=vec.begin();iter!=vec.end();i++)
cout<<*iter<<endl;
其中iter是指针,相当于这个vector的位置,所以取出来的是相应的值。
然后稍微改进的方法
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> towSum1;
for(int i=0;i<nums.size();i++){
for(int j=i+1;j<nums.size();j++){
if(nums[j] == target - nums[i]){
towSum1.push_back(i);
towSum1.push_back(j);
return towSum1;
}
}
}
return towSum1;
}
};
第二次遍历从i+1开始,然后求差值来对比;
第二种方法用两次哈希表,牺牲空间换时间的方法
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
map<int,int> m;vector<int> twoSum;
for(int i=0;i<nums.size();i++){
m.insert(pair<int,int> (nums[i],i));
}
for(int i=0;i<nums.size();i++){
map<int,int>::iterator iter;
int a=target-nums[i];
iter=m.find(a);
if(iter!=m.end()&&iter->second!=i)
{
twoSum.push_back(i);
twoSum.push_back(iter->second);
return twoSum;
}
}return twoSum;
}
};
首先学习了map的使用方法,其中插入使用了m.insert(pair<int,int> (nums[i],i));来插入数据。使用迭代器来查找key对应的值
iter=m.find(key);
if(iter!=m.end())来查找,注意iter要定义(同上定义迭代器)
此方法思路就是把每个vector的值和下标反过来存(key是值,value是下标),然后通过值和目标target的差是否在map的key上,这样找到key对应的value也就是下标,然后就返回两个下标就可以了。
官方解答三
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
map<int,int> m;vector<int> twoSum;
for(int i=0;i<nums.size();i++){
map<int,int>::iterator iter;
int a=target-nums[i];
iter=m.find(a);
if(iter!=m.end()&&iter->second!=i)
{
twoSum.push_back(iter->second);
twoSum.push_back(i);
return twoSum;
}
m.insert(pair<int,int>(nums[i],i));
}return twoSum;
}
};
此方法是一遍查找一遍存放,如[3,2,1,5,6] target为5,那么第一次存放的是【3,0】,第二个直接找到第一个。然后返回和上面要反过来,因为每次都是从新的一个开始找前面的,要先显示前面的下标。