题目描述 :
给定一个整数数组 nums 和一个目标值 target, 请你在该数组中找到和为目标值的那两个整数, 并返回他们的数组下标
你可以假设每种输入只会对应一个答案, 但是, 你不能重复利用这个数组中同样的元素
实例 :
给定 nums = [2, 7, 11, 15] , target = 9
因为nums[0] + nums[1] = 2 +7 =9
所以返回 [ 0,1 ]
我的解答 :
方法一 :
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[j]== target-nums[i]){
return new int[] {i,j};
}
}
}
throw new IllegalArgumentException("no solution");
}
方法二 :
利用hash表来优化速度
public int[] twoSum (int[]nums, int target){
Map<Integer,Integer> map = new HashMap<>();
int[] result = {0,0};
for(int i = 0; i < nums.length; i++){
map.put(nums[i],i);
}
for(int i = 0; i < nums.length; i++){
int j = target - nums[i];
if(map.containsKey(j) && i !=map.get(j)){
result[0] = map.get(j);
result[1] = i;
}
}
return result;
}
方法三 :
将hash表和判断放入同一个循环中, 时间复杂度和空间复杂度都为O(n)
public int[] twoSum (int[] nums, int target){
Map<Integer,Integer> map = new HashMap<>();
int[] result = {0,0};
for(int i = 0; i < nums.length; i++){
int j = target - nums[i];
if(map.containsKey(j) && i !=map.get(j)){
result[0] = map.get(j);
result[1] = i;
}
map.put(nums[i],i);
}
return result;
}