【leetcode算法】02-两数之和

本文介绍了LeetCode上的经典算法题——两数之和,提供了两种解题思路:暴力枚举和哈希映射。暴力枚举通过两层遍历来寻找目标值,而哈希映射利用了数据结构的特性,降低了时间复杂度。文章还给出了相应的Java代码实现。

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

目录

1、题目描述

2、解题思路

第一种解法:暴力枚举

第二种解法:哈希映射

3、代码展示

4、小结


前言

声明:本文仅为学习记录,图片以及题目资源来自牛客和力扣网,如有侵权请联系删除

大家好,我是尼根。一个又菜又想学算法的准程序猿😏,今天为大家带来一道leetcode上简单的算法题,^_+两数之和^_+。

1、题目描述

给定一个整数数组nums,和一个整数目标值target,请你找出整数数组中和为目标值target的两个整数,并返回他们在整数数组中的+_+下标+_+。

注意:

数组中目标值只会对应一组答案,而且数组中同一个元素只能使用一次。

示例1:

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

输出:[0,1]

解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1]

示例2:

输入:nums= [4,4]  target = 8

输出:[0,1]

2、解题思路

第一种解法:暴力枚举

💂第一种解法:暴力枚举

最直接的办法就是假设数组nums中每个元素都是被加数,然后到数组剩余的元素中寻找加数,利用方程判断是否满足target-被加数。

第一步:第一层遍历,选择被加数

第二步:第二层遍历,选择加数,加数遍历开始位置是被加数的下一个元素,因为之前的相加不符合的情况已经排除过了

第三步:拿到加数和被加数,判断二者之和是否等于target

              👷1)不等于,被加数更新到下一个元素,加数更新到当前被加数的下下个元素,继续遍历判断

              👷2)相同,结果数组中保存加数和被加数的下标,并将其返回

第四步:遍历结束,返回结果数组

 

第二种解法:哈希映射

💂第二种解法:哈希映射

注意到题目中强调的每个元素只会使用一次的特点,即^o^元素无重复^o^。那是否可以利用具备这样特点的容器来解决问题呢?答案是可以的,题目本质是在让我们寻找加数和被加数,当我们假设数组中某一元素为被加数时,我们只需要寻找加数即可,但是暴力解法中把寻找加数放到了一个数组中,而在数组中查找元素是需要遍历的,这无疑会提高时间复杂度。此时,如果我们想降低时间复杂度,考虑到两个未知的变量必须固定一个才可以解决,即一个等式解决不了两元问题。所以,两层遍历中只能消除一层,我们选择的是加数的一层也就是第二层遍历,即把加数的寻找放到一个无需遍历也能找到的容器中,数据结构里满足这种条件的只有一个哈希表可以,键存储加数,值存储加数的下标。每次确定一个被加数,然后根据target-被加数可以确定加数但是它的查找要到哈希表中找,如果有,将其下标和加数的下标返回;否则将这个不满足条件的加数添加到加数容器哈希表中

第一步:假设被加数为第一个元素,开始第一层遍历

第二步:到哈希表中寻找加数

             👷1)加数存在,结果数组中保存加数和被加数的下标,将其返回

             👷2)加数不存在,将加数及其下标以键值对的形式加入到加数容器哈希表中,更新被加数,继续第二步

第三步:遍历结束,返回结果数组

3、代码展示

💂第一种解法:暴力枚举

/**
* 暴力解法
* @author tmz
* @date 1-21-2022
*/
private int[] twoSum(int[] nums,int target){
    //结果数组
    int[] res = new int[2];
    //遍历
    for(int i=0;i<nums.length;i++){
        for(int j=i+1;j<nums.length;j++){
             //判断
             if(target-nums[i]==nums[j]){
                res[0] = i;
                res[1] = j;
                return res;
             }
        }
    }
    //返回结果
    return res;
}

 💂第二种解法:哈希映射

/**
* 哈希映射
* @author tmz
* @date 1-21-2022
*/
private int[] twoSum(int[] nums,int target){
    //结果
    int[] res = new int[2];
    //被加数容器
    Map<Integer,Integer> map = new HashMap<>();
    //遍历被加数
    for(int i=0;i<nums.length;i++){
         //寻找被加数
         if(map.contains(target-nums[i])){
                //存在
                res[0] = i;
                res[1] = map.get(target-nums[i]);
                return res;
         }
         map.put(target-nums[i],i);
    }
    //返回结果
    return res;
}

 

4、小结

两数之和的问题比较简单,思路网上也比较多,大同小异,推荐哈希映射解法,因为它的时间复杂度更低,效率更高。上述的思路描述中,如有遗漏或者逻辑错误的地方请小伙伴们在评论区指出。最后,我是尼根,一个又菜又想学算法的准程序猿😏,2022年一月21日,午日晴风暖煦,阳光照过的地方皆是希望发芽的伊始!一起努力学习进步,咱们+_+下一篇+_+见!

fd2d4cef86d9fed1b91bdf6cb4fd1ccc.jpeg

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值