注意:本文中的完整代码可以直接在leetcode中通过测试,但在其他编译器中运行时还需要添加头文件以及主函数才可成功运行。
1.粗暴法
1.使用两层循环进行嵌套,第二层的j初始值赋值为i+1;第一层嵌套的i
2.直接返回{i,j}即可,不仅需要在if语句中返回,还需在for循环外部再返回一次。
class Solution {
public:
vector<int> TwoSum(vector<int>& nums, int target) { #size()函数用于获取容器的长度
int i = 0, j = 0;
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 };
}
}
}
return { i,j };
};
};
代码解释:
1.函数TwoSum前的vector<int>表示的是函数的返回值为vector类型的整型值
2.vector &nums:nums为一个引用,引用的内容是vector这个容器内部存放的整型数据
2.哈希法
2.1两遍哈希表:(使用两次循环)
1.建立空的map,键和值都是整型的;建立容器b,用来存放下标值
map<int,int> a; #建立空的哈希表
vector<int> b(2,-1); #建立一个大小为2,值为-1的容器
2.遍历nums,给哈希表赋值
for(int i = 0;i<nums.size();i++){
a.insert(map<int,int> :: value_type(nums[i],i)) #将nums的数值作为哈希表的键,索引值作为哈希表的值
}
哈希表实例:
key | value |
2 | 0 |
7 | 1 |
11 | 2 |
3.目标数和哈希表的键作差,若差在哈希表中存在,则将哈希表的值存在容器b中
if(a.count(target-nums[i])>0 && a[target-num[i]] != i){ #此处还得确保找到的数不是本身,题目要求同一个索引值不可出现两次
b[0] = a[target-num[i]];
b[1] = i;
break;
}
count函数是用于计数的,键(数)如果在哈希表中存在,则对应值(索引值)也会存在,即使是下标为0,也表示为存在,count函数的结果也会为1,即会大于零。
完整代码:
class Solution{
public:
vector<int> Twosum(vector<int>& nums,int target){
map<int,int> a; #int是代表键值的类型,此处都为整型
vector<int> b;
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){
b[0] = a[target - num[i]];
b[1] = i;
break; #找到一个值之后即退出循环,因为题目要求只有两个索引值
}
}
return b;
};
};
2.2一遍哈希法:(使用一次循环)
1.创建空的哈希表a和装结果的容器b
2.直接判断哈希表中是否存在和差(目标和值的差)相同的数,有的话保存在b中;没有的话将输入的值保存在哈希表中
完整代码:
class Solution{
public:
vector<int> Twosum(vector<int>& nums,int target){
map<int,int> a; #int是代表键值的类型,此处都为整型
vector<int> b;
for(int i = 0;i < nums.size();i ++){
if(a.count(target - nums[i]) > 0){
b[0] = a[target - num[i]];
b[1] = i;
break; #找到一个值之后即退出循环,因为题目要求只有两个索引值
}
else{
a[num[i]] = i;
}
}
return b;
};
};