leetcode记录——1、两数之和

        两数之和是第一题,所以对于时间和内存方面的要求并不像后续题目一样要求严格,可以用暴力法直接求解。

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        int i,j;
        for(i = 0;i < nums.size();i++){
            for(j = i+1;j<nums.size();j++){
                if(nums[i]==target-nums[j]){
                    return {i,j};
                }
            }
        }
        return {i,j};
    }
};

暴力法思路:通过两次循环直接进行比对,同时因为题目中说明了只有两个数字,因此不需要使用vector进行添加

         

 思路优化:通过hash表进行存储,将位置存储进去。仅需一次遍历,每次查找当前数字与目标之间的差是否在hash表中存在。如果存在于map之中,就直接取出数据位置,若不存在,则将当前的值,作为关键字插进去,位置作为键值

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

        

写在后面:我第一想法其实是排序之后用双指针进行查找——因为排序之后数据便具有大小顺序,那么只需比对前后指针之和,若小于target便不存在,若大于或等于,则进行移动的操作。

该思路适用于查看是否存在,两个数能满足target的条件,而该题中需要返回数字的index,而排序本身会打乱index,所以无法适用于该题(但可以通过存储index,使用结构体之类的方式进行排序),不再进行赘述。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值