力扣-1.两数之和 c++

本文探讨了一道编程题目,涉及寻找数组中两个数的和等于目标值的问题。作者首先介绍了朴素的遍历加判断的暴力解法,然后讨论了利用哈希表进行优化的解决方案,以减少不必要的遍历。文章通过对比两种方法,解释了哈希表在解决此类问题上的优势,并给出了因忽视特定测试用例导致的错误及其解决方法。
摘要由CSDN通过智能技术生成

题目

个人解题思路

这个题呢,不考虑别的,就做出来而言还是很简单的,遍历+判断就行。但是吧,这样明显太菜了,不过呢,我又没想到什么好的办法,于是只能往优化遍历的方向走,就是减少不必要的遍历次数。结果,出题者的用例真是太全了,也是我考虑的比较简单,开始只考虑全正,全负,结果还有一正一负的用例出现,我就知道,减少不了遍历次数了,于是老老实实的暴力法提交了。

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

优解

        在优解中使用了map这种容器,构建了哈希表(都是我没用过的东西)。map容器和python中的字典类似,有键和键值,可通过键寻找键值。将每一次的target-nums[i],都存入哈希表中,在存入之前先用map.find(target-nums[i])寻找是否存在符合要求的值。描述得不是很好,大致就是依次遍历数组,遍历的同时比较已经遍历的数组中是否存在符合要求的结果——target-当前值=已经存在的值时,遍历结束。

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int, int> hashtable; //创建无序map,普通map是有序的,根据键值从小到大排列
        for (int i = 0; i < nums.size(); ++i) {
            auto it = hashtable.find(target - nums[i]); //寻找之前计算结果中是否有符和要求的
            if (it != hashtable.end()) { //it 找不到为空,找到了就为整个元素{key,value};
                return { it->second, i };  //it->first 表示的是这个元素的key的值;it->second 表示的是这个元素的value的值。
            }
            hashtable[nums[i]] = i; //这一步比较看不懂,这一步同时把键和键值存入map中
        }
        return {};
    }
};

问题

ERROR: AddressSanitizer: heap-buffer-overflow on address 0x60200000380 at pc Oox0000034c733 bp Ox7ff8178defo sp Ox7f1f81

解决办法:注意最后输入的测试用例,一般就能发现问题我是因为没有考虑到[3,2,3] 6这个测试用例而出现的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值