【刷题】两数之和

问题描述:

在这里插入图片描述


解决方案:

第一次尝试:双指针

本来我想的是在有序数组上查找2个数字,比较方便,然后我就想从小到大排序。
然后运用双指针p和q,一个在头,一个在尾,这样的话,时间复杂度为 O ( n ) O(n) O(n)

  • 如果p+q >target ,q左移
  • 如果p+q<target,p右移
  • 如果p+q=target,就是我们要找的数字了

但是,最后题目要输出的是原来数组中的下标,不是排序后的下标,也不是p和q所指的数字。
于是这个方法不行!继续想

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
//先将数组从小到大排列
        sort(nums.begin(),nums.end());
        int p=0,q=nums.size()-1;
        vector<int>res;
        while(p!=q){
            if(nums[p]+nums[q]>target){
                q--;
            }
            else if(nums[p]+nums[q]<target){
                p++;
            }
            else{
                res.push_back(p);
                res.push_back(q);
                return res;
            }
        }
        return res;
    }
};

第二次:使用unordered_map

这里先详细介绍一下unordered_map:

  • 首先,unordered_map容器是无序的。底层原理是hash table
  • 以键值对(pair类型)的形式存储数据,存储的各个键值对的键 互不相同且不允许被修改
  • **find() 函数:**查找以key为键的键值对,如果找到返回一个指向该键值对的正向迭代器。如果没有找到,指向容器最后一个键值对之后位置的迭代器(就是调用end()函数)
  • end()函数,返回指向容器一个键值对之后位置的正向迭代器
  • insert()函数:向容器添加新的键值对。对一个map进行操作时,必须记住元素类型是pair. 通常对于想要插入的数据如果没有现成的pair对象,可以创建一个pair对象。
可以这么写:
1. map.insert({word,1})  //用花括号初始化
2. map.insert(make_pair(word,1)) //调用make_pair
3. map.insert(pair<string,int>(word,1))//显式的构造pair
4. map.insert(map<string,int>:value_type(word,1))//调用参数

最后的代码:

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int,int>map;
        for(int i=0;i<nums.size();i++){
            map.insert(pair<int,int>(nums[i],i));
            auto iter=map.find(target-nums[i]);
            if(iter!=map.end() && iter->second!=i){
                return {iter->second,i};
            }
        }
        return {};

    }
};

时间复杂度很显然是 O ( n ) O(n) O(n)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寒江雪ing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值