LeetCode算法之TwoSum(哈希表 简单)

首先先给出问题描述,

给定一个整数数组,返回两个数字的索引,使它们相加到特定目标。

您可以假设每个输入只有一个解决方案,并且您可能不会两次使用相同的元素。

例:

给定nums = [2,7,11,15],target = 9,

因为nums [ 0 ] + nums [ 1 ] = 2 + 7 = 9,
返回[ 0,1 ]。

首先在不考虑时间和空间的情况下,暴力方法几乎可以解决所有算法问题,但是当今社会无论何种情况,哪怕再小的公司也没有人愿意聘用用暴力算法解决问题的程序员,所以我的所有算法介绍都没有暴力算法的介绍。

自己的解决方案:在拿到问题时,考虑到只用到数组里面2个数字的和来解决问题,第一个想到数据结构哈希表,也就是map来解决。具体实现方法如下:

public int[] twoSum(int[] nums, int target) {
        if(nums==null||nums.length==0){
            throw new IllegalArgumentException("给定数组为空");
        }
    Map<Integer, Integer> map = new HashMap<>();
    for (int i = 0; i < nums.length; i++) {
        map.put(nums[i], i);
    }
    for (int i = 0; i < nums.length; i++) {
        int complement = target - nums[i];
        if (map.containsKey(complement) && map.get(complement) != i) {
            return new int[] { i, map.get(complement) };
        }
    }
    throw new IllegalArgumentException("No two sum solution");
}

再仔细思考后发现这种方法需要遍历2次数组,能不能在第一次遍历的时候就判断结果呢,答案是可以的。实现如下:

public int[] twoSum(int[] nums, int target) {
    if(nums==null||nums.length==0){
           throw new IllegalArgumentException("给定数组为空");
    }
    Map<Integer, Integer> map = new HashMap<>();
    for (int i = 0; i < nums.length; i++) {
        int complement = target - nums[i];
        if (map.containsKey(complement)) {
            return new int[] { map.get(complement), i };
        }
        map.put(nums[i], i);
    }
    throw new IllegalArgumentException("No two sum solution");
}

这道题是比较简单了,没有过多介绍想法,代码看两眼都会懂的you

猜你喜欢

转载自blog.csdn.net/qq_27817327/article/details/82969742