栏目分类:
子分类:
返回
终身学习网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
终身学习网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间:发布时间: 百科书网 趣学号
题目

个人解题思路

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

class Solution {
public:
    vector twoSum(vector& 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 twoSum(vector& nums, int target) {
        unordered_map 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这个测试用例而出现的

转载请注明:文章转载自 www.051e.com
本文地址:http://www.051e.com/it/1033440.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 ©2023-2025 051e.com

ICP备案号:京ICP备12030808号