leetcode1 两数之和

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;
    };
    
};

法二:哈希表

  1. 不论哈希表中有多少数据,查找、插入、删除(有时包括删除)只需要接近常量的时间即0(1)的时间级。
  2. 保持数组中的每个元素与其索引相互对应的最好方法
  • 过程中用到map
  1. map介绍:https://www.cnblogs.com/fnlingnzb-learner/p/5833051.html
  2. Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据 处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。
  3. 疑问: 哈希表能不能都用map来实现
  • map介绍
  1. 可以参见这两篇博客 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的函数
  1. Map中的元素是自动按key升序排序,所以不能对map用sort函数。
  2. find等函数也是查找的key ,不是变量值
  3. 用iterator->first和iterator->second 访问key和变量值。
  4. 也可以用map[key]来访问变量值
  5. 插入数据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;
    }
};
    

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值