【LeetCode简单题】-两数之和

本文探讨了在数组中寻找两个数使它们的和等于特定目标数的问题,对比了暴力算法与使用HashMap的解决方案,后者显著提高了效率,将时间复杂度从O(n^2)降低至接近O(n)。

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

Task:

在这里插入图片描述

思路:
  1. 暴力算法:
    时间复杂度是O(n2)
    (1)遍历整个数组找到nums[i]
    (2)从nums[i]之后的元素开始遍历,得到nums[j]
    (3)判断nums[i]和nums[j]的值是不是相等,如果是的话返回两个下标

  2. Hash Map的解题思路:

(1)建立存放结果的向量result;
(2)构建一个一一对应的map,都是int类型
(3)遍历数组
a)记录每一个数组元素的对应的补集,也就是对应的目标数减去当前遍历到的元素的值;
b)然后对该值在map中查找,如果找到了,那就把当前正在遍历的元素的补充元素的索引以及当前元素的索引push_back到存放结果的向量中;
c)如果没有找到,那就把当前元素的索引值和当前元素在map之中对应起来
d)思考:也就是说如果在这个过程中不是在第一步就找到了,那就会每循环一次,使得map中的“对儿”多一对,直到找到这样的结果!
(4)最后返回我们要的结果

代码
  1. 暴力法代码:
class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        int i,j;
        for(int i=0; i<nums.size()-1; i++){
            for(int j=i+1; j<nums.size(); j++){
                if(nums[i]+nums[j] == target)
                    return {i,j};
            }
        }
        return {i,j};
    }
};
  1. 哈希map法的代码:
class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) 
    {
        vector <int> result;
        map<int,int> maps;// 提供1对1的hash,索引值是int,关联的值为int
        for( int i = 0; i < nums.size(); i++)
        {
            int complement = target - nums[i];
            if( maps.find(complement) != maps.end()) //find,如果找到则返回的是被查找元素的位置,否则返回map::end()位置
            {                                        //所以就是如果找到了那就进行下面的操作,如果没找到,那就把i的值给对应到当前i的值的map中
                result.push_back(maps[complement]);
                result.push_back(i);
            }
            maps[nums[i]] = i; // 插入默认初始化元素的key值nums[i],然后给对应的值设置为i
        }
        return result;
    }
};

但是这里我对map的理解还不行!今天解决掉!

提交结果:
  1. 暴力法结果:
    在这里插入图片描述

  2. 哈希Map法的提交结果:
    在这里插入图片描述
    可以看出来利用hash表之后程序执行的时间明显的下降了!说明降低了时间复杂度!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值