题目
给 nums = [2, 7, 11, 15], target = 9
返回 [0, 1]
因为 nums[0] + nums[1] = 2 + 7 = 9
解答
方法一:暴力(两个月前在LeetCode提交的java)
class Solution {
public int[] twoSum(int[] nums, int target) {
for (int i = 0; i < nums.length; i++) {
for (int j =0; j < nums.length; j++) {
if (nums[j] == target - nums[i] && i!=j) {
return new int[] { i, j };
}
}
}
throw new IllegalArgumentException("No two sum solution");
}
}
方法二:hash哈希(c++)
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int,int>mapping;
vector<int>result;
for(int i=0;i<nums.size();i++){
mapping[nums[i]]=i;//存储对应数的下标
}
for(int j=0;j<nums.size();j++){
int gap=target-nums[j];//计算需要匹配的数的大小
if(mapping.find(gap)!=mapping.end()&&mapping[gap]>j){
//大于j是因为,避免一个数(3)被用两次,比如6=3+3;避免重复判断,例如2+7=7+2
result.push_back(j);
result.push_back(mapping[gap]);//结果是两个数
}
}
return result;
}
};
Tips收获
1.红黑树是平衡的二叉查找树,自平衡二叉查找树。
2.map vs unordered_map:
map内部实现了一个红黑树,所有元素都是有序的
unordered_map内部实现一个哈希表,元素是杂乱无序的
3.map<int,int>m,第一个int是key的数据类型,第二个int是value的数据类型,m是这个map的名称,通过key来找value的大小,在本题中,key是nums,value是map下标。
4.map.find() vs map[]
map的下标运算符[]的作用是:将关键码作为下标去执行查找,并返回对应的值;如果不存在这个关键码,就将一个具有该关键码和值类型的默认值的项插入这个map。
map的find函数:用关键码执行查找,找到了返回该位置的迭代器;如果不存在这个关键码,就返回尾迭代器,即map.end()。