给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
暴力
暴力1
//j在前,i在后,使用二维数组res来装答案;
//需要注意的点,1判断元素是否重合,2输出的答案只有一组。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> res;//将找到的结果放入res里面
for (int i = 1; i < nums.size(); i ++ ){//i是走在后面
for (int j = 0; j < i; j ++ ){//j在i前面,每次做到i的前一个位置,这就保证了同一个元素只能只用一遍这个条件
if (nums[i] + nums[j] == target) {//满足条件
res = vector<int> ({j, i});//将数据放入res里面
break;//每种输入只对应一个答案,所以当我们成功找到结果是就退出来
}
}
if (res.size() > 0) break;//如果res里有多个答案的时候,我们就退出
}
return res;//返回答案
}
};
暴力2
//~~解释:由public内的定义知,返回值得类型,肯定是一个二维数组,或者两个数【我也不知道,所以这句话希望有大佬可以指点一下】~~
//i在前,j在后。直接返回i,j
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
int i, j;
for (i = 0; i < nums.size(); i ++ ){
for (j = i + 1; j < nums.size(); j ++ ){
if (nums[i] + nums[j] == target)
return {i, j};
}
}
return {i, j};
}
};
/*
注解:就是关于最后一个return
虽然本题里面说了一定有解,所以在for内部就会有返回了,
但是力扣在测评的时候会检测是否所有情况都具有返回的情况,
为了不报错,我们还是要加上这么一句
也可以写为
return {};
return {0};
return {0,0;
return {10,100};
return {10, 100, 0};
这里的return不会被执行。
以上都是对的,都经过本人亲测以及漫长的等待!(吐槽:力扣真的好慢呀(#*^*#))
*/
/*
注解:为啥要写成return {};等操作,而不是return 0; 呢?
这是因为声明函数类型的时候使用的vector,
如果是int类型,就要return 0;了。
哈希表
哈希表1
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int , int> heap;//前一个int是key,有一个int是value
for (int i = 0; i < nums.size(); i ++ ){
int t = target - nums[i];
if (heap.count(t)) return {heap[t], i};
heap[nums[i]] = i;
//heap[当前数字] = 当前数字的索引
}
return {};
}
};
/*
unordered_map 使用find的时候,返回的是一个iterator
*/