[Lesson Learn] LeetCode #1 Two Sum

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值