题目:
给定一个整数数组 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) {
int i;
int j;
for(i = 0;i<nums.size()+1;i++)
{
for(j=i+1;j<nums.size();j++ )
{
if(nums[i] + nums[j] == target)
{
return {i,j};
}
}
}
return {i,j};
}
};
解析:1> 在数组中定义两个下标,一个 i 指向数组中第一个元素,另外一个 j 指向 i 后面一个元素。
2> 两层循环,首先让 j 先向后跑,每跑一次计算一次 nums[i] + nums[j] 的值,并与 target 比较。
3> j 跑一遍之后,i++ ,i 向后走一位,再执行第二步。
4> 执行第三步使 i 跑完整个数组。
注:该方法时间复杂度 O(n^2),空间复杂度O(1);
方法二、一遍哈希表
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
map<int,int> a;//提供一对一的hash
vector<int> b(2,-1);//用来承载结果,初始化一个大小为2,值为-1的容器b
for(int i=0;i<nums.size();i++)
{
if(a.count(target-nums[i])>0)
{
b[0]=a[target-nums[i]];
b[1]=i;
break;
}
a[nums[i]]=i;//反过来放入map中,用来获取结果下标
}
return b;
};
};
注:时间复杂度:O(n)
空间复杂度:O(n)