LeetCode官方题解:https://leetcode-cn.com/problems/two-sum/solution/liang-shu-zhi-he-by-leetcode-2/
目录
一 、需求
A:给定一个整数数组 nums 和一个目标值 target;
B:在该数组中找出和为目标值的那两个整数;
C:找到后返回他们的数组下标;
D:每种输入只对应一个答案;
E:不能重复使用数组中同样的元素,如数组[5,4,6,8],当target为10时,不能两次都使用5;
二、暴力匹配算法
-
思路分析
A:使用数组第1个元素与第2,3,4依次相加,加法结果与target比较
a:相等:将这两个元素对应的下标返回;
b:不相等:回到A(这时候从第2个元素开始);
B:输出结果;
-
算法实现
class Solution {
public int[] twoSum(int[] nums, int target) {
for(int i = 0; i < nums.length-1; i++) {
for(int j = i+1 ; j < nums.length; j++) {
if(nums[i]+nums[j] == target) {
return new int[] {i,j};
}
}
}
throw new IllegalArgumentException("No two sum solution");
}
}
-
复杂度分析
A:两层循环,时间复杂度为O(n^2);
B:空间复杂度为O(1);
三、两边哈希表实现
-
思路分析
A:为什么要使用HashMap?
a:key唯一且无顺序要求,采用HashHashMap即可;
B:定义集合Map泛型,在堆内存开辟HashMap子类对象,这里用到多态;
C:向集合中添加键和值
a:通过for循环添加,数组值作为键,其对应的下标作为值(因为要找的是下标);
D:到Map集合里查找
a:利用for循环,得到每一个键(也就是数组值);
b:将target与得到的键相减,结果保存到辅助变量中;
c:然后就去集合里找这个结果是否存在,并且不能和减数是同一个值;
E:最后返回结果;
-
算法实现
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
map.put(nums[i], i);
}
for (int i = 0; i < nums.length; i++) {
int complement = target - nums[i];
if (map.containsKey(complement) && map.get(complement) != i) {
return new int[] { i, map.get(complement) };
}
}
throw new IllegalArgumentException("No two sum solution");
}
}
-
复杂度分析
A:代码中将n个元素遍历了2次,哈希表查找元素是O(1),所以时间复杂度为O(n);
B:因为哈希表存储了n个元素,所以空间复杂度为O(n);
四、一遍哈希表
-
思路分析
A:定义带有泛型的集合map,在堆内存生成HashMap子类对象;
B:利用for循环,得到每一个数组值;
C:设置辅助变量,保存target与数组值相减后的结果;
D:查找该结果是否在map集合里,不存在就添加到集合,存在就返回结果;
a:第一次循环,map里没有元素,那么nums[0]就加入到集合中;
b:第二次循环,判断complement是否在map中,而map中只有一个元素,也就是complement与nums[0]比较
相 等: 返回下标[0 1] ;
不相等: 将nums[1]加入到map中,到步骤c;
c:第三次循环,就是将complement与map中nums[0],nums[1]比较
相 等: 返回下标[0 2]或[1 2];
不相等: 将nums[2]加入到map中,到步骤d;
d:第四次循环,就是将complement与map中nums[0],nums[1],nums[2]比较
相 等: 返回下标[0 3] 或 [1 3] 或[2 3];
不相等: 将nums[3]加入到map中,然后退出循环;
-
算法实现
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
int complement = target - nums[i];
if (map.containsKey(complement)) {
return new int[] { map.get(complement), i };
}
map.put(nums[i], i);
}
throw new IllegalArgumentException("No two sum solution");
}
}
-
复杂度分析
A:代码中将n个元素遍历了1次,所以时间复杂度为O(n);
B:哈希表存储了n个元素,所以空间复杂度为O(n);