计算两个数的和算法

举报
Linux猿 发表于 2021/12/13 23:43:36 2021/12/13
【摘要】 CSDN博客专家🏆,华为云享专家🏆,数据结构和算法、C/C++、面试、刷题、Linux尽管咨询我,关注我,有问题私聊! 优质好文持续更新中……🚀 欢迎小伙伴们点赞👍、收藏⭐、留言💬

🎈 作者:Linux猿

🎈 简介:CSDN博客专家🏆,华为云享专家🏆,数据结构和算法、C/C++、面试、刷题、Linux尽管咨询我,关注我,有问题私聊!

🎈 关注专栏:优质好文持续更新中……🚀

🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬


一、题意

给定一个整数数组 nums 和一个整数 target ,找到数组里的两个数的和等于 target,返回这两个数在数组中的下标,假设每个输入都只有一个解决方案,并且不能两次使用相同的元素。可以按任何顺序返回答案。

注意:数组无序。

二、测试样例

输入: nums = [2,7,11,15], target = 9

输出: [0,1]

解释:因为 2 + 7 = 9,数字 2和7的在数组中的下标分别为 0和1,所以输出 [0,1]。

二、解题思路

遍历数组 nums,使用哈希表(unordered_map类型)存储数组中遍历过的元素,每遍历一个元素 nums[i],查找哈希表中是否存在 target - nums[i],如果不存在,则将 nums[i] 和 下标 i 存储到哈希表中,如果存在,则返回当前下标以及哈希表中 target - nums[i] 对应的值。

通俗一点的说就是:每次在哈希表中查找 target - nums[i] 是否存在,一直查询到一个结果。

三、代码实现

class Solution
{
public:
    vector<int> twoSum(vector<int>& nums, int target)
    {
        unordered_map<int, int> hashTable; //哈希表
        vector<int> ret;
        for(int i = 0; i < (int)nums.size(); ++i) { //依次遍历每一个元素
            if(hashTable.count(target - nums[i])) {//查找 target - nums[i] 是否存在
                ret.push_back(i); // 存储下标
                ret.push_back(hashTable[target - nums[i]]); //存储下标
                return ret;
            } 
            hashTable[nums[i]] = i;
        }
        return ret;
    }
};

四、时间复杂度分析

时间复杂度:使用哈希表存储,每次查询的时间是O(1),最多遍历 n 个元素,故时间复杂度为 O(n)。


CSDN博客专家🏆,华为云享专家🏆,数据结构和算法、C/C++、面试、刷题、Linux尽管咨询我,关注我,有问题私聊!

优质好文持续更新中……🚀 欢迎小伙伴们点赞👍、收藏⭐、留言💬



【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。