Skip to content

Commit d307bdf

Browse files
author
luzhipeng
committedJul 15, 2019
feat: 221
1 parent 356e90a commit d307bdf

7 files changed

+117
-5
lines changed
 

‎README.en.md

+4-3
Original file line numberDiff line numberDiff line change
@@ -83,9 +83,9 @@ The data structures mainly includes:
8383

8484
## Top Problems Progress
8585

86-
- [Top 100 Liked Questions](https://leetcode.com/problemset/top-100-liked-questions/) (77 / 100)
86+
- [Top 100 Liked Questions](https://leetcode.com/problemset/top-100-liked-questions/) (79 / 100)
8787

88-
- [Top Interview Questions](https://leetcode.com/problemset/top-interview-questions/) (96 / 145)
88+
- [Top Interview Questions](https://leetcode.com/problemset/top-interview-questions/) (97 / 145)
8989

9090
## Portals
9191

@@ -166,7 +166,8 @@ The data structures mainly includes:
166166
- [0199.binary-tree-right-side-view](./problems/199.binary-tree-right-side-view.md)
167167
- [0201.bitwise-and-of-numbers-range](./problems/201.bitwise-and-of-numbers-range.md)
168168
- [0208.implement-trie-prefix-tree](./problems/208.implement-trie-prefix-tree.md)
169-
- [0209.minimum-size-subarray-sum](./problems/209.minimum-size-subarray-sum.md)
169+
- [0209.minimum-size-subarray-sum](./problems/209.minimum-size-subarray-sum.md)
170+
- [0221.maximal-square](./problems/221.maximal-square.md) 🆕
170171
- [0230.kth-smallest-element-in-a-bst](./problems/230.kth-smallest-element-in-a-bst.md)
171172
- [0236.lowest-common-ancestor-of-a-binary-tree](./problems/236.lowest-common-ancestor-of-a-binary-tree.md)🆕
172173
- [0238.product-of-array-except-self](./problems/238.product-of-array-except-self.md)

‎README.md

+3-2
Original file line numberDiff line numberDiff line change
@@ -101,9 +101,9 @@ leetcode 题解,记录自己的 leetcode 解题之路。
101101

102102
## Top题目进度
103103

104-
- [Top 100 Liked Questions](https://leetcode.com/problemset/top-100-liked-questions/) (77 / 100)
104+
- [Top 100 Liked Questions](https://leetcode.com/problemset/top-100-liked-questions/) (79 / 100)
105105

106-
- [Top Interview Questions](https://leetcode.com/problemset/top-interview-questions/) (96 / 145)
106+
- [Top Interview Questions](https://leetcode.com/problemset/top-interview-questions/) (97 / 145)
107107

108108
## 传送门
109109

@@ -185,6 +185,7 @@ leetcode 题解,记录自己的 leetcode 解题之路。
185185
- [0201.bitwise-and-of-numbers-range](./problems/201.bitwise-and-of-numbers-range.md)
186186
- [0208.implement-trie-prefix-tree](./problems/208.implement-trie-prefix-tree.md)
187187
- [0209.minimum-size-subarray-sum](./problems/209.minimum-size-subarray-sum.md)
188+
- [0221.maximal-square](./problems/221.maximal-square.md) 🆕
188189
- [0230.kth-smallest-element-in-a-bst](./problems/230.kth-smallest-element-in-a-bst.md)
189190
- [0236.lowest-common-ancestor-of-a-binary-tree](./problems/236.lowest-common-ancestor-of-a-binary-tree.md)🆕
190191
- [0238.product-of-array-except-self](./problems/238.product-of-array-except-self.md)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<mxfile modified="2019-07-15T12:54:51.988Z" host="www.draw.io" agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36" etag="0SHnDeWQuCcCTJ8FEEFX" version="10.9.7" type="device"><diagram id="ITySGz5PNGcrqbwhJsbM" name="第 1 页">7ZxRb6s2FMc/TR5XBRwIeWy7tJO2K03qpLu3yQU3WAPMwGnSffqZBifBh9w1u4YDrH1psB0Cv/PH5/wxyYzcp/vHgubxFxGxZObOo/2M/DhzXWfh+upf1fJ2aAlW5NCwKXhUDzo1PPG/Wd04r1u3PGJlY6AUIpE8bzaGIstYKBtttCjErjnsRSTNT83phoGGp5AmsPUrj2Rcn4W7PLX/xPgm1p/s+KtDT0r14PpMyphGYnfWRNYzcl8IIQ+v0v09Syp4msvhfQ8Xeo8HVrBMfuQNZP3153X+eMteY775/TFwfotffqj38kqTbfOES/mmERRim0Ws2st8Ru52MZfsKadh1btTQVdtsUwTteWol6UsxJ/sXiSiUC2ZyNSwuxeeJGaTyGQdbcdX2/VxsEKy/cUTdI7YlN6YSJks3tQQ/Qa/Jq2lVm/uTnHz6qb4LGS6jdZK2Rx3fIKpXtQ8r2DrArbz0bI9Xo8DYUsmpFt3YLpdTEi3ZGC69abEdmC69Sc0J5i5zCHIcJcTEq6ZzNDhBraVW0HTHGcueXgg6m9YWQ4d+up/AN1Mf+jQ9fFMYpI2EyA+3SnbOQe7vnCgoRsvXZAD0elat3QDnI9BEkSnDs3e9KiDLIhOHdrA8c4kIAui052yEXTRa4wpO0F8utAKjpju4LRr3fMNKKuh09VKnYR2zayGT9e6t2sB2Qq8gyy2WGDThF7uO7XaI00za+HTtO/deqQ5OG1aX4DrkaaZlfBpWl9y65Pm4LRp3VthZqEVNk3rXgozC6HTvG4Zzbm2/oR3s/QTYV47eSvJyTMgewDyogXyojPI9pfNPijZSzcWu0ha2FLWZmOU0yxIWug00axTh5o1k5mHXRoQaKnGT9lMcviU0axWl5QHp+XrlsX+SynhhwF7fvloKZGzgqtTY0X1CTzbqB6ViTtJfm3wey0xiPXVMcTkhy/lKTk2D72UmJJjw6dpfbUL8b4hPk00a9ZFFsKmqeftUWoTZCF0mtAcAJi54JmqcNav6iRLXTbpL81VfCNaxkfY36qtlutbf10NSugzS34VJZdcZKovZNUnqI6KLg9p8osx4FlIKdKzAbcJ31QdUlTRpPXWcT/q+PLq8NP9pvr+401ahpTdRCwvWEgli25yUaqRf7x/FdHQwPmBRly9oT6GHSulJRksDBk48O6R26sMoHv5lMEFGZRiW8XIShkVGDpYwunA0ZfouRDczoRg/7nDPqtS0sC5JPCy6nd2HfMal+sMjeaYHZM7OG2O2TGRwWlzzI6JDE6bY3ZMIAsFyDS9MTsmkIXQaV63aDWS1eygCbnFlvZ6q9mDtvQ7If+rZM+5G0sq8/e/1njYmH211xoM/DE/NQhyGfp8geaoLqm4gxwXYFcMHtraVIeUzdyHT/k6BzbqadnMiQFZ3iA/4+VByzbd1W/X1D4+fvs/B4KXF/Hnkil5vAC7yvCn5PHwaUKPNyKag9PmdWZuWDTNO434NKE7G482QRZCpwkr2pl3V52Gp17Pv9A9T2m1l6e/tuosAWiFQl50BpArWKA01zFTHkXVvu+aETz7Iq2rt9vWKTcFjTg79VnMeNrH1pFT1TeInKuv9H5CB6vhz9B9JHS+jx46WEl/hq49dMtG6FYtT63aCp3aPP3o9Xvf2U+Hk/U/</diagram></mxfile>
28.7 KB
Loading
26.8 KB
Loading
23.5 KB
Loading

‎problems/221.maximal-square.md

+109
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
2+
## 题目地址
3+
4+
https://leetcode.com/problems/number-of-islands/
5+
6+
## 题目描述
7+
8+
9+
```
10+
Given a 2d grid map of '1's (land) and '0's (water), count the number of islands. An island is surrounded by water and is formed by connecting adjacent lands horizontally or vertically. You may assume all four edges of the grid are all surrounded by water.
11+
12+
Example 1:
13+
14+
Input:
15+
11110
16+
11010
17+
11000
18+
00000
19+
20+
Output: 1
21+
Example 2:
22+
23+
Input:
24+
11000
25+
11000
26+
00100
27+
00011
28+
29+
Output: 3
30+
```
31+
32+
## 思路
33+
34+
![221.maximal-square](../assets/problems/221.maximal-square-1.jpg)
35+
36+
符合直觉的做法是暴力求解处所有的正方形,逐一计算面积,然后记录最大的。这种时间复杂度很好。
37+
38+
我们考虑使用动态规划,我们使用dp[i][j]表示以matrix[i][j]为右下角的顶点的可以组成的最大正方形的边长。
39+
那么我们只需要计算所有的i,j组合,然后求出最大值即可。
40+
41+
我们来看下dp[i][j] 怎么推导。 首先我们要看matrix[i][j], 如果matrix[i][j]等于0,那么就不用看了,直接等于0。
42+
如果matrix[i][j]等于1,那么我们将matrix[[i][j]分别往上和往左进行延伸,直到碰到一个0为止。
43+
44+
如图 dp[3][3] 的计算。 matrix[3][3]等于1,我们分别往上和往左进行延伸,直到碰到一个0为止,上面长度为1,左边为3。
45+
dp[2][2]等于1(之前已经计算好了),那么其实这里的瓶颈在于三者的最小值, 即`Min(1, 1, 3)`, 也就是`1`。 那么dp[3][3] 就等于
46+
`Min(1, 1, 3) + 1`
47+
48+
![221.maximal-square](../assets/problems/221.maximal-square-2.jpg)
49+
50+
dp[i - 1][j - 1]我们直接拿到,关键是`往上和往左进行延伸`, 最直观的做法是我们内层加一个循环去做就好了。
51+
但是我们仔细观察一下,其实我们根本不需要这样算。 我们可以直接用dp[i - 1][j]和dp[i][j -1]
52+
具体就是`Min(dp[i - 1][j - 1], dp[i][j - 1], dp[i - 1][j]) + 1`
53+
54+
![221.maximal-square](../assets/problems/221.maximal-square-3.jpg)
55+
56+
事实上,这道题还有空间复杂度O(N)的解法,其中N指的是列数。
57+
大家可以去这个[leetcode讨论](https://leetcode.com/problems/maximal-square/discuss/61803/C%2B%2B-space-optimized-DP)看一下。
58+
## 关键点解析
59+
60+
- DP
61+
- 递归公式可以利用dp[i - 1][j]和dp[i][j -1]的计算结果,而不用重新计算
62+
- 空间复杂度可以降低到O(n), n为列数
63+
64+
## 代码
65+
66+
```js
67+
68+
69+
70+
/*
71+
* @lc app=leetcode id=221 lang=javascript
72+
*
73+
* [221] Maximal Square
74+
*/
75+
/**
76+
* @param {character[][]} matrix
77+
* @return {number}
78+
*/
79+
var maximalSquare = function(matrix) {
80+
if (matrix.length === 0) return 0;
81+
const dp = [];
82+
const rows = matrix.length;
83+
const cols = matrix[0].length;
84+
let max = Number.MIN_VALUE;
85+
86+
for (let i = 0; i < rows + 1; i++) {
87+
if (i === 0) {
88+
dp[i] = Array(cols + 1).fill(0);
89+
} else {
90+
dp[i] = [0];
91+
}
92+
}
93+
94+
for (let i = 1; i < rows + 1; i++) {
95+
for (let j = 1; j < cols + 1; j++) {
96+
if (matrix[i - 1][j - 1] === "1") {
97+
dp[i][j] = Math.min(dp[i - 1][j - 1], dp[i - 1][j], dp[i][j - 1]) + 1;
98+
max = Math.max(max, dp[i][j]);
99+
} else {
100+
dp[i][j] = 0;
101+
}
102+
}
103+
}
104+
105+
return max * max;
106+
};
107+
```
108+
109+

0 commit comments

Comments
 (0)
Please sign in to comment.