目录
前言
声明:本文仅为学习记录,图片以及题目资源来自牛客和力扣网,如有侵权请联系删除
大家好,我是尼根。一个又菜又想学算法的准程序猿😏,今天为大家带来一道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日,午日晴风暖煦,阳光照过的地方皆是希望发芽的伊始!一起努力学习进步,咱们+_+下一篇+_+见!