[Lesson Learn] LeetCode #1 Two Sum

来源:互联网 发布:linux nls 简体中文 编辑:程序博客网 时间:2024/05/24 04:14

LeetCode官方提供的是有“参考答案”的,我也是看了的,下边贴的代码,如果不是我写的,我会标明;否则,默认的,都是我写的。为了学习,LeetCode官方提供的代码都亲手敲了至少一遍。


第一种方法,暴力破解,遍历数组。

以下是官方提供的Java代码:

public int[] twoSum(int[] nums, int target) {<pre name="code" class="java">    for (int i = 0; i < nums.length; i++) {        for (int j = i + 1; j < nums.length; j++) {            if (nums[j] == target - nums[i]) {                return new int[] { i, j };            }        }    }    throw new IllegalArgumentException("No two sum solution");}
其中内层循环之前,可以添加一条代码

int complement = target - nums[i];

可以用来减少部分计算。不过这都是皮毛,主要用时花在循环上。


[Lesson Learn]

暴力破解的英语表达是:brute force.

如果最后没找到符合条件的结果,则抛出异常,抛异常这个写法非常好。

空格添加的好,便于阅读。

return时还可以new一个数组,并赋值,学习了。



第二种方法,为了减少寻找 target - nums[i] 这个值时所用的查找时间,使用哈希表。将双重循环,降为两次遍历。

先将所有值映射到一个哈希表中,然后查找每一个 target - nums[i] 是否在这个哈希表中(注意不能是nums[i]本身),如果在就返回index值,否则抛异常。

以下是官方提供的Java代码:

public int[] twoSum(int[] nums, int target) {    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");}

[Lesson Learn]

学习了如何使用Map,使用哈希表。



第三种方法,每次插入哈希表前先判断原有的表内是否有符合条件的值,没有再插入,进一步将两次遍历减少为一次遍历。因为是使用的哈希表,查找原有的表内元素的时间复杂度接近O(1),而非O(n),从而每次插入前的查找可以很迅速。

以下是官方提供的Java代码:

public int[] twoSum(int[] nums, int target) {    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");}
最终时间复杂度和空间复杂度都是O(n).


[Lesson Learn]

能够减少时间的关键在于使用哈希表,减少了查找时间。


附:

LeetCode #1 题目

LeetCode #1 官方“参考答案”

0 0
原创粉丝点击