LeetCode算法刷题easy系列之两数之和

150 阅读1分钟

给定一个整数数组 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;
}