leetcode1 两数之和
相关题目:
1,167,15,16,18
法一:暴力法
1.遇到的错误
//错误点
for (j =nums.size; j>0; j--)
//报错
solution.cpp: In member function twoSum
Line 8: Char 26: error: cannot convert 'std::vector<int>::size' from type 'std::vector<int>::size_type (std::vector<int>::)() const noexcept' {aka 'long unsigned int (std::vector<int>::)() const noexcept'} to type 'int'
for (j =nums.size; j>0; j--){
^~~~
//解决方法
vector求大小size()括号漏写了
2.解答
//暴力解法
class Solution {
public:
vector<int> result;
vector<int> twoSum(vector<int>& nums, int target) {
int i, j;
for (i = 0; i < nums.size()-1; i++ ){
for (j =i+1; j<nums.size(); j++){
if (nums[i]+ nums[j] == target){
result.push_back(i);
result.push_back(j);
}
}
}
return result;
};
};
法二:哈希表
-
哈希表的优点
- 不论哈希表中有多少数据,查找、插入、删除(有时包括删除)只需要接近常量的时间即0(1)的时间级。
- 保持数组中的每个元素与其索引相互对应的最好方法
- 过程中用到map
- map介绍:https://www.cnblogs.com/fnlingnzb-learner/p/5833051.html
- Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据 处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。
- 疑问: 哈希表能不能都用map来实现
- map介绍
- 可以参见这两篇博客 https://www.cnblogs.com/fnlingnzb-learner/p/5833051.html 以及 https://blog.csdn.net/allovexuwenqiang/article/details/5686583
map的基本操作函数:
C++ maps是一种关联式容器,包含“关键字/值”对
begin() 返回指向map头部的迭代器
clear() 删除所有元素
count() 返回指定元素出现的次数
empty() 如果map为空则返回true
end() 返回指向map末尾的迭代器
equal_range() 返回特殊条目的迭代器对
erase() 删除一个元素
find() 查找一个元素
get_allocator() 返回map的配置器
insert() 插入元素
key_comp() 返回比较元素key的函数
lower_bound() 返回键值>=给定元素的第一个位置
max_size() 返回可以容纳的最大元素个数
rbegin() 返回一个指向map尾部的逆向迭代器
rend() 返回一个指向map头部的逆向迭代器
size() 返回map中元素的个数
swap() 交换两个map
upper_bound() 返回键值>给定元素的第一个位置
value_comp() 返回比较元素value的函数
- Map中的元素是自动按key升序排序,所以不能对map用sort函数。
- find等函数也是查找的key ,不是变量值
- 用iterator->first和iterator->second 访问key和变量值。
- 也可以用map[key]来访问变量值
- 插入数据insert()是不覆盖的,用数组的方式插入是会覆盖的。
代码
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> result;
map<int, int> hash_table;
for (int i=0; i < nums.size(); i++)
{
hash_table [nums[i]] = i;
}
for( int i=0; i < nums.size();i++)
{
if( hash_table.count(target-nums[i]) !=0 && hash_table [target-nums[i]] !=i)
//注意,你不能重复利用这个数组中同样的元素,是指不能数组中的这个元素,而不是数值相同的其他元素,例如【3,3] 6,是应该得到结果0,1的
{
result.push_back(i);
result.push_back(hash_table[target-nums[i]]);
break;
}
}
return result;
}
};
法三:优化版哈希表
//把哈希表的生成和查询结合到一个循环里
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> result;
map <int, int> hash_table;
for(int i = 0; i < nums.size(); i++){
if (hash_table.count(target -nums[i])!=0 && hash_table[target -nums[i] ] != i)
{
result.push_back(i);
result.push_back(hash_table[target -nums[i]]);
break;
}
hash_table[nums[i]] = i; //这个要放到后面,不然【3,3】,6的测试用例过不了
}
return result;
}
};