给定整数数组inputs , 指定结果target , 在数组中找出两个数之和等于target , 然后返回两个数在数组中的下标
方法一:穷举法
- 利用双循环列举所有两个数相加的结果
- 在这些所有结果中判断与target相等的值
- 获取与target相等值的两个数的下标返回
- 时间复杂度为O(n²)
- 空间复杂度为O(1)
public int[] twoSum1(int[] nums , int target) {
int n = nums.length;
for(int i = 0 ; i < n - 1 ; i++) {
for(int j = i + 1 ; j < n ; j++) {
if(nums[i] + nums[j] == target)
return new int[]{ i , j };
}
}
throw new IllegalArgumentException("no solution");
}
方法二: 利用哈希表查找结果
- 首先遍历一遍数组,把数组的每个值和下标相应保存在哈希表中
- 再次遍历数组,在循环中把target值与数组中的每个元素相减得到差值
- 在哈希表中用差值作为键查找索引,如果有则获取其哈希表中存储的值
- 把当前循环的i和差值作为键对应的下标值一并返回
- 时间复杂度O(n)
- 空间复杂度O(n)
public int[] twoSum2(int[] nums , int target) {
int n = nums.length;
HashMap<Integer, Integer> map = new HashMap<>();
for(int i = 0 ; i < n ; i++) {
map.put(nums[i] , i);
}
for(int i = 0 ; i < n ; i++) {
int thatNum = target - nums[i];
if(map.containsKey(thatNum) && map.get(thatNum) != i)
return new int[]{ i , map.get(thatNum) };
}
throw new IllegalArgumentException("no solution");
}
方法三: 优化方法二
public int[] twoSum3(int[] nums , int target) {
int n = nums.length;
HashMap<Integer, Integer> map = new HashMap<>();
for(int i = 0 ; i < n ; i++) {
int thatNum = target - nums[i];
if(map.containsKey(thatNum))
return new int[]{ map.get(thatNum) , i };
map.put(nums[i] , i);
}
throw new IllegalArgumentException("no solution");
}