LeetCode01(两数之和)

  题目:

    给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。例子如下所示:

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

因为 nums[0] + nums[1] = 2 + 7 = 9

所以返回 [0, 1]


    第一种方法是最简单的——暴力拆解。

    利用两个for循环进行对nums数组的遍历,如果存在两数组元素相加得到target的话,那就肯定能找出来,如果不存在就肯定报错。代码如下所示:

class Solution {

    public int[] twoSum(int[] nums, int target) {

            for(int i = 0; i < nums.length ; i++){

                for(int j = i + 1; j < nums.length; j++){

                    if(nums[i] + nums[j] == target) {

                    return new int[] { i, j };

                    }

                }

            }

             throw new IllegalArgumentException("No two sum solution");

         }

}

                                                                               这种暴力拆解的方法时间复杂度为 o(n^2)

可以看到暴力拆解用时很长

    第二种方法是利用哈希表(记录对应数组下标与所需值)

    解题方法:设定一个complement值,complement = target - nums[i],意义在于记录当前的nums[i]的值与target相差多少,如果在后面的遍历查找中找到相应缺失的值,即可完成。使用哈希表的方法,可以只使用一次for循环遍历整个数组即可,其余交给map的方法。代码如下:

classSolution {

publicint[] twoSum(int[] nums,inttarget) {

Map  map =newHashMap<>();

for(inti =0; i

intcomplement = target - nums[i];

if(map.containsKey(nums[i])){

returnnewint[]{map.get(nums[i]),i};

                }

                map.put(complement,i);

            }

returnnewint[]{-1,-1};

        }

}

虽然哈希表占用了一些内存,但是相对于暴力拆解的时间来说是值得的



    这一道题虽然可以用暴力的办法去解决,但是即便是4个数组已经花费很多的时间,对于实际问题来说恐怕所花费的时间是恐怖的。这道题还引出了哈希表的用法,可以用于记录需要的值与对应的序号,而且哈希表对于占用内存来说很小,所以以后需要相关记录的题目,可以考虑哈希表。

你可能感兴趣的:(LeetCode01(两数之和))