|
1 |
| -#### [1. 两数之和](https://leetcode-cn.com/problems/two-sum/) |
2 |
| - |
3 |
| -给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 |
4 |
| - |
5 |
| -你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。 |
6 |
| - |
7 |
| -``` |
8 |
| -示例: |
9 |
| -
|
10 |
| -给定 nums = [2, 7, 11, 15], target = 9 |
11 |
| -
|
12 |
| -因为 nums[0] + nums[1] = 2 + 7 = 9 |
13 |
| -所以返回 [0, 1] |
14 |
| -``` |
15 |
| - |
16 |
| - |
17 |
| - |
18 |
| -这道题本身如果通过暴力遍历的话也是很容易解决的,时间复杂度在 O(n2)。由于**哈希查找的时间复杂度为 O(1)**,所以可以利用哈希容器 map 降低时间复杂度 |
19 |
| - |
20 |
| -- 遍历数组 nums,i 为当前下标,每个值都判断map中是否存在 target-nums[i] 的 key 值 |
21 |
| -- 如果存在则找到了两个值,如果不存在则将当前的 (nums[i],i) 存入 map 中,继续遍历直到找到为止 |
22 |
| - |
23 |
| -**动画图解:** |
24 |
| - |
25 |
| - |
26 |
| - |
27 |
| -```java |
28 |
| -class Solution { |
29 |
| - public int[] twoSum(int[] nums, int target) { |
30 |
| - Map<Integer, Integer> map = new HashMap<Integer, Integer>(); |
31 |
| - //注意:不能调用自身两次,所以不能先把所有值加入map,再判断是否contain,这样没办法避免重复调用的情况 |
32 |
| - //解决办法:先判断是否contain,再加入map |
33 |
| - for (int i = 0; i < nums.length; ++i) { |
34 |
| - if (map.containsKey(target - nums[i])) { |
35 |
| - return new int[]{map.get(target - nums[i]), i}; |
36 |
| - } |
37 |
| - map.put(nums[i], i); |
38 |
| - } |
39 |
| - return new int[0]; |
40 |
| - } |
41 |
| -} |
42 |
| -``` |
43 |
| - |
44 |
| -> 时间复杂度:O(N),其中 N是数组中的元素数量。对于每一个元素 x,我们可以 O(1) 地寻找 target - x。 |
45 |
| -> |
46 |
| -> 空间复杂度:O(N),其中 N 是数组中的元素数量。主要为哈希表的开销。 |
| 1 | +#### [1. 两数之和](https://leetcode-cn.com/problems/two-sum/) |
| 2 | + |
| 3 | +给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 |
| 4 | + |
| 5 | +你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。 |
| 6 | + |
| 7 | +``` |
| 8 | +示例: |
| 9 | +
|
| 10 | +给定 nums = [2, 7, 11, 15], target = 9 |
| 11 | +
|
| 12 | +因为 nums[0] + nums[1] = 2 + 7 = 9 |
| 13 | +所以返回 [0, 1] |
| 14 | +``` |
| 15 | + |
| 16 | + |
| 17 | + |
| 18 | +这道题本身如果通过暴力遍历的话也是很容易解决的,时间复杂度在 O(n2)。由于**哈希查找的时间复杂度为 O(1)**,所以可以利用哈希容器 map 降低时间复杂度 |
| 19 | + |
| 20 | +- 遍历数组 nums,i 为当前下标,每个值都判断map中是否存在 target-nums[i] 的 key 值 |
| 21 | +- 如果存在则找到了两个值,如果不存在则将当前的 (nums[i],i) 存入 map 中,继续遍历直到找到为止 |
| 22 | + |
| 23 | +**动画图解:** |
| 24 | + |
| 25 | + |
| 26 | + |
| 27 | +```java |
| 28 | +class Solution { |
| 29 | + public int[] twoSum(int[] nums, int target) { |
| 30 | + Map<Integer, Integer> map = new HashMap<Integer, Integer>(); |
| 31 | + //注意:不能调用自身两次,所以不能先把所有值加入map,再判断是否contain,这样没办法避免重复调用的情况 |
| 32 | + //解决办法:先判断是否contain,再加入map |
| 33 | + for (int i = 0; i < nums.length; ++i) { |
| 34 | + if (map.containsKey(target - nums[i])) { |
| 35 | + return new int[]{map.get(target - nums[i]), i}; |
| 36 | + } |
| 37 | + map.put(nums[i], i); |
| 38 | + } |
| 39 | + return new int[0]; |
| 40 | + } |
| 41 | +} |
| 42 | +``` |
| 43 | + |
| 44 | +> 时间复杂度:O(N),其中 N是数组中的元素数量。对于每一个元素 x,我们可以 O(1) 地寻找 target - x。 |
| 45 | +> |
| 46 | +> 空间复杂度:O(N),其中 N 是数组中的元素数量。主要为哈希表的开销。 |
47 | 47 | >
|
0 commit comments