[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
- [Lesson Learn] LeetCode #1 Two Sum
- [Lesson Learn] LeetCode #2 Add Two Numbers
- LeetCode 1 - Two Sum
- leetcode 1 Two Sum
- Leetcode【1】:Two Sum
- [leetcode 1] Two Sum
- 【leetcode-1】Two Sum
- [leetcode 1] Two Sum
- [Leetcode] 1 - Two Sum
- LeetCode (1) Two Sum
- LeetCode 1:《Two Sum》
- LeetCode | #1 Two Sum
- leetcode-1 Two Sum
- Two Sum | LeetCode(1)
- [Leetcode]1Two Sum
- leetcode 1 Two Sum
- leetcode #1 Two Sum
- leetcode 1:Two Sum
- 【Android 基础】SimpleAdapter的简单使用
- vijosP1143三取方格 多线程dp
- 博客
- Glob通配符
- 数据库设计三大范式
- [Lesson Learn] LeetCode #1 Two Sum
- 在Windows上安装Docker
- ACM--BFS--nyoj 58--最少步数
- Dev-C++ 配置SDL开发环境
- java设计模式-单例模式
- MST算法之Prim算法
- handler消息传递机制
- 《简单的逻辑学》读后感
- 毕设相关