解法1:暴力法:
最容易想到的方法是枚举数组中的每一个数 x,寻找数组中是否存在 target - x。
当我们使用遍历整个数组的方式寻找 target - x 时,需要注意到每一个位于 x 之前的元素都已经和 x 匹配过,因此不需要再进行匹配。而每一个元素不能被使用两次,所以我们只需要在 x 后面的元素中寻找 target - x。
class Solution {
public int[] twoSum(int[] nums, int target) {
for(int i = 0;i < nums.length;i++) {
for(int j =i + 1;j < nums.length;j++) {
if(nums[i] + nums[j] == target){
return new int[]{i,j};//创建有i和j的数组
}
}
}
return new int[]{};//返回创建的新的空数组
}
}
注意:数组的长度是属性
解法2:查找表法:在遍历的同时记录一些信息,以省去一些循环,这是以“空间换时间的想法”需要记录已经遍历过的数值和他所对应的下标,可以借助查找表实现
注:查找表有两个常用的实现,分别是:哈希表和平衡二叉搜索树,由于我们不需要维护查找表中的元素的顺序,因此哈希表就是我们的首选。
思路:先创建一个哈希表,key和value都是int类型。然后开始遍历数组nums,i为nums数组的当前下标,每遍历数组中的一个nums[i],就判断哈希表中是否包含target-nums[i]的key值,如果不包含这个值,则将当前遍历到的以这种形式(nums[i],i)存到哈希表中,继续遍历直到找到为止;
如果哈希表中存在target-nums[i]的key值,则就找到了两个相加为target的值,就可以通过哈希表中的key(这里哈希表的key=target-nums[i])来得到value(这里哈希表的value=元素下标);
如果最终都没有结果就返回空数组。
代码:
class Solution {
public int[] twoSum(int[] nums, int target) {
Map
for(int i = 0; i< nums.length; i++) {
if(map.containsKey(target - nums[i])) {//判断哈希表中是否包含target - nums[i]值
return new int[] {map.get(target-nums[i]),i};//如果包含就返回map通过key获取value(也就是target - nums[i]元素在哈希表中的下标)和遍历到的nums[i]的i下标
}
map.put(nums[i], i);//如果哈希表中不存在,就将当前遍历的元素加入表中
}
return new int[0];//最终找不到两个元素的和为target,就返回空数组
}
}



