给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
首先对于这道题,我首先想到的就是暴力破解,即遍历数组,找到满足两数之和等于目标数的两个元素
class Solution {
public int[] twoSum(int[] nums, int target) {
int[] result=new int[2];
for(int i=0;i<nums.length;i++){
for(int j=i+1;j<nums.length;j++){
if(nums[j]==target-nums[i]){
result[0]=i;
result[1]=j;
return result;
}
}
}
return result;
}
}
但是这样的时间并没有达到很理想的效果,于是我尝试改变搜索的方法,即创建一个链表,在加入元素时判断当前链表中是否存在满足 target-nums的元素存在,存在就返回两个元素的下标
class Solution {
public int[] twoSum(int[] nums, int target) {
List<Integer> list=new ArrayList<Integer>();
for(int i:nums){
if(list.contains(target-i))
return new int[] {list.indexOf(target-i),list.size()};
list.add(i);
}
throw new IllegalArgumentException("No two sum solution");
}
}
但是这样时间反而长了,进行相关的搜索后认识到链表的实现可能浪费了大量的实践,于是我转而采用了哈希表,搜索方法采用上述的方法,取得了较号的成果。
class Solution {
public int[] twoSum(int[] nums, int target) {
Map map=new HashMap();
for(int i=0;i<nums.length;i++){
if(map.containsKey(target-nums[i]))
return new int[]{(int)map.get(target-nums[i]),i};
map.put(nums[i],i);
}
throw new IllegalArgumentException("No two sum solution");
}
}