1.题目描述
2.题解
i.暴力解法
用两层循环遍历每个元素和其他所有元素的和,判断该和是否和目标值一样,若判断成立则将两个下标传入一个结果数组。
ii.哈希表
暴力解法的模式是找两个满足条件的数,而哈希表的模式就是已知一个数和目标值,去找另一个满足大小等于目标值减已知数的数。
这个算法的核心就是,并不是一开始就将原数组中所有元素都赋给哈希表,而是在遍历的过程中,将没有找到另一个对应数的数插入哈希表,直到最后在哈希表中找到了原数组中某个数的对应数。
考虑到赋给哈希表的数要有数及其对应的下标(且数不能重复),考虑到map中的键不重复的特性,这道题倾向于用map来解决。
3.代码示例
i.暴力解法
class Solution {
public int[] twoSum(int[] nums, int target) {
int []a=new int[2];
for(int i=0;i<nums.length;i++){
for(int j=i+1;j<nums.length;j++){
if(nums[i]+nums[j]==target){
a[0]=i;
a[1]=j;
}
}
}
return a;
}
}
ii.哈希表
public int[] twoSum(int[] nums, int target) {
int[] result = new int[2];
if(nums == null || nums.length == 0){
return result;
}
Map<Integer, Integer> map = new HashMap<>();
for(int i = 0; i < nums.length; i++){
int temp = target - nums[i];//定义一个对应数满足大小等于目标值-原数组某一个元素
// 遍历当前元素,并在map中寻找是否有匹配的key
if(map.containsKey(temp)){
result[1] = i;
result[0] = map.get(temp);
break;
}
map.put(nums[i], i);// 如果没找到匹配对,就把访问过的元素和下标加入到map中
}
return result;
}
4.问题总结
i.关于map中键值和数组中元素下标的对应关系
本题希望得到的效果是数组中同一个元素在答案里不能重复出现。而map中的键是不重复的,因此键对应元素,值对应下标。