Skip to content

Commit cb87680

Browse files
committed
添加题解
1 parent 34b7734 commit cb87680

File tree

14 files changed

+514
-21
lines changed

14 files changed

+514
-21
lines changed

docs/.vuepress/public/1.png

-790 KB
Binary file not shown.

docs/algorithm/1.md

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
# 画解算法 1-两数之和
2+
3+
## 题目链接
4+
5+
https://leetcode-cn.com/problems/two-sum/
6+
7+
## 题目描述
8+
9+
给定一个整数数组 `nums` 和一个目标值 `target`,请你在该数组中找出和为目标值的那 `两个` 整数,并返回他们的数组下标。
10+
11+
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
12+
13+
示例:
14+
15+
```bash
16+
给定 nums = [2, 7, 11, 15], target = 9
17+
18+
因为 nums[0] + nums[1] = 2 + 7 = 9
19+
所以返回 [0, 1]
20+
```
21+
22+
## 解题方案
23+
24+
### 思路
25+
26+
- 标签:哈希映射
27+
- 这道题本身如果通过暴力遍历的话也是很容易解决的,时间复杂度在O(n2)
28+
- 由于哈希查找的时间复杂度为O(1),所以可以利用哈希容器map降低时间复杂度
29+
- 遍历数组nums,i为当前下标,每个值都判断map中是否存在`target-nums[i]`的key值
30+
- 如果存在则找到了两个值,如果不存在则将当前的`(nums[i],i)`存入map中,继续遍历直到找到为止
31+
- 如果最终都没有结果则抛出异常
32+
- 时间复杂度:O(n)
33+
34+
35+
### 代码
36+
37+
```java
38+
class Solution {
39+
public int[] twoSum(int[] nums, int target) {
40+
Map<Integer, Integer> map = new HashMap<>();
41+
for(int i = 0; i< nums.length; i++) {
42+
if(map.containsKey(target - nums[i])) {
43+
return new int[] {map.get(target-nums[i]),i};
44+
}
45+
map.put(nums[i], i);
46+
}
47+
throw new IllegalArgumentException("No two sum solution");
48+
}
49+
}
50+
```
51+
52+
### 画解
53+
54+
![fr&lt;x&gt;ame_00001.png](https://i.loli.net/2019/06/01/5cf1f2e35c06642234.png)
55+
![fr&lt;x&gt;ame_00002.png](https://i.loli.net/2019/06/01/5cf1f2e35f57264864.png)
56+
![fr&lt;x&gt;ame_00003.png](https://i.loli.net/2019/06/01/5cf1f2e35b59064943.png)
57+
![fr&lt;x&gt;ame_00004.png](https://i.loli.net/2019/06/01/5cf1f2e35d6a751753.png)
58+
![fr&lt;x&gt;ame_00005.png](https://i.loli.net/2019/06/01/5cf1f2e3531b152490.png)
59+
60+
<span style="display:block;text-align:center;">点击「<strong>阅读原文</strong>」打卡</span>
61+
<span style="display:block;text-align:center;">后台回复「<strong>算法</strong>」,加入天天算法群</span>
62+
<span style="display:block;text-align:center;">觉得算法直击灵魂,欢迎点击<strong>在看</strong>和<strong>转发</strong></span>
63+
64+
![](https://i.loli.net/2019/05/20/5ce23b33cc01d73486.gif)

docs/algorithm/101.md

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ https://leetcode-cn.com/problems/symmetric-tree/
2828
3 3
2929
```
3030

31-
3231
## 解题方案
3332

3433
### 思路
@@ -44,7 +43,17 @@ https://leetcode-cn.com/problems/symmetric-tree/
4443
- 短路:在递归判断过程中存在短路现象,也就是做``操作时,如果前面的值返回false则后面的不再进行计算
4544
- 时间复杂度:O(n)
4645

47-
![算法动图](https://i.loli.net/2019/05/21/5ce372e8d671878546.gif)
46+
### 画解
47+
48+
![fr&lt;x&gt;ame_00001.png](https://i.loli.net/2019/05/31/5cf0874b6d81810598.png)
49+
![fr&lt;x&gt;ame_00004.png](https://i.loli.net/2019/05/31/5cf0874b6e9b376592.png)
50+
![fr&lt;x&gt;ame_00007.png](https://i.loli.net/2019/05/31/5cf0874b6687591951.png)
51+
![fr&lt;x&gt;ame_00010.png](https://i.loli.net/2019/05/31/5cf0874c2f02f59006.png)
52+
![fr&lt;x&gt;ame_00013.png](https://i.loli.net/2019/05/31/5cf0874bb1afc28470.png)
53+
![fr&lt;x&gt;ame_00018.png](https://i.loli.net/2019/05/31/5cf0874b8c70a78148.png)
54+
![fr&lt;x&gt;ame_00022.png](https://i.loli.net/2019/05/31/5cf0874d6cb0069836.png)
55+
![fr&lt;x&gt;ame_00026.png](https://i.loli.net/2019/05/31/5cf0874d15ae839505.png)
56+
4857

4958
### 代码
5059

docs/algorithm/152.md

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
# 画解算法 152-乘积最大子序列
2+
3+
## 题目链接
4+
5+
https://leetcode-cn.com/problems/maximum-product-subarray/
6+
7+
## 题目描述
8+
给定一个整数数组 `nums` ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。
9+
10+
示例 1:
11+
12+
```bash
13+
输入: [2,3,-2,4]
14+
输出: 6
15+
解释: 子数组 [2,3] 有最大乘积 6。
16+
```
17+
18+
示例 2:
19+
20+
```bash
21+
输入: [-2,0,-1]
22+
输出: 0
23+
解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。
24+
```
25+
26+
## 解题方案
27+
28+
### 思路
29+
30+
- 标签:动态规划
31+
- 遍历数组时计算当前最大值,不断更新
32+
- 令imax为当前最大值,则当前最大值为`imax = max(imax * nums[i], nums[i])`
33+
- 由于存在负数,那么会导致最大的变最小的,最小的变最大的。因此还需要维护当前最小值imin,`imin = min(imin * nums[i], nums[i])`
34+
- 当负数出现时则imax与imin进行交换再进行下一步计算
35+
- 时间复杂度:O(n)
36+
37+
38+
### 代码
39+
40+
```java
41+
class Solution {
42+
public int maxProduct(int[] nums) {
43+
int max = Integer.MIN_VALUE, imax = 1, imin = 1;
44+
for(int i=0; i<nums.length; i++){
45+
if(nums[i] < 0){
46+
int tmp = imax;
47+
imax = imin;
48+
imin = tmp;
49+
}
50+
imax = Math.max(imax*nums[i], nums[i]);
51+
imin = Math.min(imin*nums[i], nums[i]);
52+
53+
max = Math.max(max, imax);
54+
}
55+
return max;
56+
}
57+
}
58+
```
59+
60+
### 画解
61+
62+
![fr&lt;x&gt;ame_00001.png](https://i.loli.net/2019/05/31/5cf100371851e95229.png)
63+
![fr&lt;x&gt;ame_00002.png](https://i.loli.net/2019/05/31/5cf100376afa975823.png)
64+
![fr&lt;x&gt;ame_00003.png](https://i.loli.net/2019/05/31/5cf100375cea549162.png)
65+
![fr&lt;x&gt;ame_00004.png](https://i.loli.net/2019/05/31/5cf100376732f17773.png)
66+
![fr&lt;x&gt;ame_00005.png](https://i.loli.net/2019/05/31/5cf100375d10f70525.png)
67+
![fr&lt;x&gt;ame_00006.png](https://i.loli.net/2019/05/31/5cf100378639829913.png)
68+
![fr&lt;x&gt;ame_00007.png](https://i.loli.net/2019/05/31/5cf10038d011223514.png)
69+
70+
71+
<span style="display:block;text-align:center;">点击「<strong>阅读原文</strong>」打卡</span>
72+
<span style="display:block;text-align:center;">后台回复「<strong>算法</strong>」,加入天天算法群</span>
73+
<span style="display:block;text-align:center;">觉得算法直击灵魂,欢迎点击<strong>在看</strong>和<strong>转发</strong></span>
74+
75+
![](https://i.loli.net/2019/05/20/5ce23b33cc01d73486.gif)

docs/algorithm/162.md

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,6 @@ https://leetcode-cn.com/problems/find-peak-element/
4848
- 根据左右指针计算中间位置m,并比较m与m+1的值,**如果m较大**,则左侧存在峰值,r=m,**如果m+1较大**,则右侧存在峰值,l=m+1
4949
- 时间复杂度:O(logN)
5050

51-
![算法动图](https://i.loli.net/2019/05/22/5ce4acefdd49632328.gif)
52-
5351
### 代码
5452

5553
```java
@@ -69,6 +67,24 @@ class Solution {
6967
}
7068
```
7169

70+
### 画解
71+
72+
![fr&lt;x&gt;ame_00001.png](https://i.loli.net/2019/05/31/5cf0891f5087153158.png)
73+
![fr&lt;x&gt;ame_00004.png](https://i.loli.net/2019/05/31/5cf0892007d8a22329.png)
74+
![fr&lt;x&gt;ame_00007.png](https://i.loli.net/2019/05/31/5cf08928a616672740.png)
75+
![fr&lt;x&gt;ame_00010.png](https://i.loli.net/2019/05/31/5cf089202646a63184.png)
76+
![fr&lt;x&gt;ame_00013.png](https://i.loli.net/2019/05/31/5cf089204f2c868528.png)
77+
![fr&lt;x&gt;ame_00016.png](https://i.loli.net/2019/05/31/5cf089352bf0671647.png)
78+
![fr&lt;x&gt;ame_00019.png](https://i.loli.net/2019/05/31/5cf08934dec9d79586.png)
79+
![fr&lt;x&gt;ame_00022.png](https://i.loli.net/2019/05/31/5cf089392e87a43304.png)
80+
![fr&lt;x&gt;ame_00025.png](https://i.loli.net/2019/05/31/5cf0893932a8420427.png)
81+
![fr&lt;x&gt;ame_00028.png](https://i.loli.net/2019/05/31/5cf08934e258229687.png)
82+
![fr&lt;x&gt;ame_00031.png](https://i.loli.net/2019/05/31/5cf08934de2be33159.png)
83+
![fr&lt;x&gt;ame_00034.png](https://i.loli.net/2019/05/31/5cf089369cd2580967.png)
84+
![fr&lt;x&gt;ame_00037.png](https://i.loli.net/2019/05/31/5cf0893693aa452745.png)
85+
86+
87+
7288
<span style="display:block;text-align:center;">点击「<strong>阅读原文</strong>」打卡</span>
7389
<span style="display:block;text-align:center;">后台回复「<strong>算法</strong>」,加入天天算法群</span>
7490
<span style="display:block;text-align:center;">觉得算法直击灵魂,欢迎点击<strong>在看</strong>和<strong>转发</strong></span>

docs/algorithm/171.md

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
# 画解算法 171-Excel表列序号
2+
3+
## 题目链接
4+
5+
https://leetcode-cn.com/problems/excel-sheet-column-number/
6+
7+
## 题目描述
8+
9+
给定一个Excel表格中的列名称,返回其相应的列序号。
10+
11+
例如,
12+
13+
```bash
14+
A -> 1
15+
B -> 2
16+
C -> 3
17+
...
18+
Z -> 26
19+
AA -> 27
20+
AB -> 28
21+
...
22+
```
23+
24+
示例 1:
25+
26+
```bash
27+
输入: "A"
28+
输出: 1
29+
```
30+
31+
示例 2:
32+
33+
```bash
34+
输入: "AB"
35+
输出: 28
36+
```
37+
38+
示例 3:
39+
40+
41+
```bash
42+
输入: "ZY"
43+
输出: 701
44+
```
45+
46+
## 解题方案
47+
48+
### 思路
49+
50+
- 标签:字符串遍历,进制转换
51+
- 初始化结果`ans = 0`,遍历时将每个字母与A做减法,因为A表示1,所以减法后需要每个数加1,计算其代表的数值`num = 字母 - ‘A’ + 1`
52+
- 因为有26个字母,所以相当于26进制,每26个数则向前进一位
53+
- 所以每遍历一位则`ans = ans * 26 + num`
54+
- 以ZY为例,Z的值为26,Y的值为25,则结果为`26 * 26 + 25=701`
55+
- 时间复杂度:O(n)
56+
57+
58+
### 代码
59+
60+
```java
61+
class Solution {
62+
public int titleToNumber(String s) {
63+
int ans = 0;
64+
for(int i=0;i<s.length();i++) {
65+
int num = s.charAt(i) - 'A' + 1;
66+
ans = ans * 26 + num;
67+
}
68+
return ans;
69+
}
70+
}
71+
```
72+
73+
### 画解
74+
75+
![fr&lt;x&gt;ame_00001.png](https://i.loli.net/2019/06/01/5cf1bbece7e4250844.png)
76+
![fr&lt;x&gt;ame_00002.png](https://i.loli.net/2019/06/01/5cf1bbecce55193177.png)
77+
![fr&lt;x&gt;ame_00003.png](https://i.loli.net/2019/06/01/5cf1bbecf008688592.png)
78+
![fr&lt;x&gt;ame_00004.png](https://i.loli.net/2019/06/01/5cf1bbed3f12c79305.png)
79+
80+
<span style="display:block;text-align:center;">点击「<strong>阅读原文</strong>」打卡</span>
81+
<span style="display:block;text-align:center;">后台回复「<strong>算法</strong>」,加入天天算法群</span>
82+
<span style="display:block;text-align:center;">觉得算法直击灵魂,欢迎点击<strong>在看</strong>和<strong>转发</strong></span>
83+
84+
![](https://i.loli.net/2019/05/20/5ce23b33cc01d73486.gif)

docs/algorithm/216.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,4 +69,4 @@ class Solution {
6969
<span style="display:block;text-align:center;">后台回复「<strong>算法</strong>」,加入天天算法群</span>
7070
<span style="display:block;text-align:center;">觉得算法直击灵魂,欢迎点击<strong>在看</strong>和<strong>转发</strong></span>
7171

72-
![](https://i.loli.net/2019/05/17/5cde9e49d28a986587.png)
72+
![](https://i.loli.net/2019/05/20/5ce23b33cc01d73486.gif)

docs/algorithm/242.md

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
# 画解算法 242-有效的字母异位词
2+
3+
## 题目链接
4+
5+
https://leetcode-cn.com/problems/valid-anagram/
6+
7+
## 题目描述
8+
9+
给定两个字符串 `s``t` ,编写一个函数来判断 `t` 是否是 `s` 的字母异位词。
10+
11+
示例 1:
12+
13+
```bash
14+
输入: s = "anagram", t = "nagaram"
15+
输出: true
16+
```
17+
18+
示例 2:
19+
20+
```bash
21+
输入: s = "rat", t = "car"
22+
输出: false
23+
```
24+
25+
说明:
26+
你可以假设字符串只包含小写字母。
27+
28+
进阶:
29+
如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?
30+
31+
## 解题方案
32+
33+
### 思路
34+
35+
- 标签:哈希映射
36+
- 首先判断两个字符串长度是否相等,不相等则直接返回false
37+
- 若相等,则初始化26个字母哈希表,遍历字符串s和t
38+
- s负责在对应位置增加,t负责在对应位置减少
39+
- 如果哈希表的值都为0,则二者是字母异位词
40+
41+
### 画解
42+
43+
![fr&lt;x&gt;ame_00001.png](https://i.loli.net/2019/05/31/5cf07cd06a41589292.png)
44+
![fr&lt;x&gt;ame_00002.png](https://i.loli.net/2019/05/31/5cf07cd0ac62470539.png)
45+
![fr&lt;x&gt;ame_00003.png](https://i.loli.net/2019/05/31/5cf07cd0a42c292358.png)
46+
![fr&lt;x&gt;ame_00004.png](https://i.loli.net/2019/05/31/5cf07cd14e28d69398.png)
47+
![fr&lt;x&gt;ame_00005.png](https://i.loli.net/2019/05/31/5cf07cd0ad83781035.png)
48+
![fr&lt;x&gt;ame_00006.png](https://i.loli.net/2019/05/31/5cf07cd322f6361559.png)
49+
![fr&lt;x&gt;ame_00007.png](https://i.loli.net/2019/05/31/5cf07cd22580f32004.png)
50+
![fr&lt;x&gt;ame_00008.png](https://i.loli.net/2019/05/31/5cf07cd3b0d4065637.png)
51+
![fr&lt;x&gt;ame_00009.png](https://i.loli.net/2019/05/31/5cf07cd4d6cf049229.png)
52+
![fr&lt;x&gt;ame_00010.png](https://i.loli.net/2019/05/31/5cf07cd2d2c8129014.png)
53+
54+
55+
### 代码
56+
57+
```java
58+
class Solution {
59+
public boolean isAnagram(String s, String t) {
60+
if(s.length() != t.length())
61+
return false;
62+
int[] alpha = new int[26];
63+
for(int i = 0; i< s.length(); i++) {
64+
alpha[s.charAt(i) - 'a'] ++;
65+
alpha[t.charAt(i) - 'a'] --;
66+
}
67+
for(int i=0;i<26;i++)
68+
if(alpha[i] != 0)
69+
return false;
70+
return true;
71+
}
72+
}
73+
```
74+
75+
<span style="display:block;text-align:center;">点击「<strong>阅读原文</strong>」打卡</span>
76+
<span style="display:block;text-align:center;">后台回复「<strong>算法</strong>」,加入天天算法群</span>
77+
<span style="display:block;text-align:center;">觉得算法直击灵魂,欢迎点击<strong>在看</strong>和<strong>转发</strong></span>
78+
79+
![](https://i.loli.net/2019/05/20/5ce23b33cc01d73486.gif)

0 commit comments

Comments
 (0)