leetcode【数组】-----1.Two sum(两数之和)

该博客介绍了LeetCode中‘两数之和’的问题,包括题目描述、暴力求解与哈希表高效解法的分析。讨论了如何利用哈希表在O(n)时间内找到目标值的数组位置,以及vector和unordered_map在解题中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、题目描述

2、分析

        给定一个数组和一个目标值,需要数组内两个数相加等于目标值,返回数组内这两个数的位置。不考虑不存在这样的两个数,也就是说数组范围内一定有解。也不考虑多组解。

        首先暴力求解。暴力求解的时间复杂度是O(n^2)。暴力求解是最容易想到的求解方法,遍历给的数组,需要注意的是i和j的选取,i和j其实就是数组的两个游标,通过移动它们,再判断,遍历所有的可能。

        更为快速的求解办法是有两种都是利用哈希表(参考官方)。第一种,遍历两次,第一次将每一个元素的值和它的索引添加到表中,第二次检查目标元素(target-nums[i])是否存在于表中。第二种在进行遍历并将元素插入到表中的同时,我们还会回过头来检查表中是否已经存在当前元素所对应的目标元素。如果它存在,那我们已经找到了对应解,并立即将其返回。

3、代码

//暴力求解
class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        
        for(int i=0;i<nums.size()-1;++i){
            for(int j=i+1;j<nums.size();++j){
                if(nums[i]+nums[j]==target){
                    vector<int> solution={i,j};
                    return solution;
                }
                    
            }
        }
//题目中测试用例不会执行到这一步,但是不加这个会出错,因为这个函数返回值是一个数组。
//也可以使用异常抛出
        vector<int> wrong;
        return wrong;
            
    }
};


//据说是leetcode的奇淫技巧,加在前面可以优化输入输出有可能会使你的程序运行速度超过100%的用户
static auto x = []() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    return 0;
}();
//哈希查找
class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int,int> map;
        int i=0;
        for(;i<nums.size();i++){
            int value=target-nums[i];
            if(map[value]!=0){
                vector<int> solution={map[value]-1,i};
                return solution;
            }
            else{
                map[nums[i]]=i+1;
            }
        }     
        vector<int> wrong;
        return wrong;
            
    }
};

4、涉及知识点

        vector的基本概念。vector.size是大小,不是下标。最后一个元素的下标应该是vector.size()-1。注意++i和i++的区别。在此题中两者不影响。unordered_map的使用,如果是用来搜索,常用unordered_map。注意如果不存在key对应的索引,对key进行访问得到的结果与类型有关。一般为0或空字符串。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值