给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
easy的算法题,暴力破解其实也是很简单的,只是复杂度高一些。
暴力破解方法
两重循环,找出每两个组合结果为target,暴力破解之所以这么暴力,是不考虑时间复杂度和效率的,用性能和时间来实现破解,这样的方法也就不能成为科学的算法
ConcurrentHashMap<Integer, List<Integer>> map = new ConcurrentHashMap<>();
for (int i = 0; i < nums.length - 1; i++) {
List<Integer> list = new ArrayList<Integer>();
for (int j = i + 1; j < nums.length; j++) {
if (nums[i] + nums[j] == target) {
list.add(j);
}
}
//这里存储的是每个
if(Collections.isNotEmpty(list)){
map.put(i, list);
}
}
return map;
哈希映射破解
想一下,能不能一次循环就结束,降低复杂度。这里我们使用哈希映射的减法来实现。
遍历数组 nums,i 为当前下标,每个值都判断map中是否存在 target-nums[i] 的 key 值,如果存在则找到了两个值,如果不存在则将当前的 (nums[i],i) 存入 map 中,继续遍历直到找到为止
public static ArrayList<int[]> twoSum(int[] nums, int target){
ArrayList<int[]> list = new ArrayList<>();
HashMap<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
if(map.containsKey(target-nums[i])){
//这里我使用集合来存储所有符合两数之和的下标
list.add(new int[] {map.get(target-nums[i]),i});
}
map.put(nums[i],i);
}
return list;
}