1.两数之和(#1)
方法签名:
- 最简单的方法可以使用暴力法进行两两组合与目标值进行一一对比,但是时间复杂度太高性能太低,在此不做实现
- 方法一: 使用Hash表实现两数之和的求解
- 思路:先将所有的数组的值作为key 数组的下标作为value映射到Map集合中,再进行数组的遍历(从前往后遍历数组的每一个元素是否存在一个值,使得当前元素值与map中保存的值之和等于目标值),使用Java语言进行实现
public int[] twoSum(int[] nums, int target) {
//定义Map存储映射
Map<Integer,Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
map.put(nums[i],i);
}
//开始寻找map中的值
for (int i = 0; i < nums.length; i++) {
int temp = target-nums[i];
if (map.containsKey(temp) && map.get(temp)!=i){
//找到了
return new int[]{i,map.get(temp)};
}
}
//没找到
throw new RuntimeException("没找到!!");
}
测试性能优点太拉胯了
- 前面这种的时间复杂度虽然只是O(n) 空间复杂度也为O(n)但是for了两次 能否实现一次for就搞定?(下面是优化后的代码)
//方法2:
public int[] twoSum2(int[] nums, int target) {
//定义Map存储映射
Map<Integer,Integer> map = new HashMap<>();
//直接进行遍历寻找map中对应的值
for (int i = 0; i < nums.length; i++) {
int temp = target-nums[i];
//先判断map中有没有 有直接返回 没有将这个值加入 这样就避免了两次for
if (map.containsKey(temp)){
return new int[]{map.get(temp),i};//注意这次的顺序 因为map中的在前属于从后往前找
}
map.put(nums[i],i);
}
throw new RuntimeException("没找到!!!");
}
- 下面这种方法虽然时间复杂度也为O(n),但是巧妙的只进行了一次for就搞定了