Skip to content

Commit 8eeb262

Browse files
committed
feat: add solutions to lc problem: No.0562
No.0562.Longest Line of Consecutive One in Matrix
1 parent 99ca8b0 commit 8eeb262

File tree

7 files changed

+310
-4
lines changed

7 files changed

+310
-4
lines changed

solution/0500-0599/0562.Longest Line of Consecutive One in Matrix/README.md

Lines changed: 112 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,22 +46,133 @@
4646

4747
<!-- 这里可写通用的实现逻辑 -->
4848

49+
**方法一:动态规划**
50+
51+
我们定义 $f[i][j][k]$ 表示方向为 $k$,且以 $(i, j)$ 结尾的最长连续 $1$ 的长度。其中 $k$ 的取值范围为 $0, 1, 2, 3$,分别表示水平、垂直、对角线、反对角线。
52+
53+
> 我们也可以用四个二维数组分别表示四个方向的最长连续 $1$ 的长度。
54+
55+
遍历矩阵,当遇到 $1$ 时,更新 $f[i][j][k]$ 的值。对于每个位置 $(i, j)$,我们只需要更新其四个方向的值即可。然后更新答案。
56+
57+
时间复杂度 $O(m\times n)$,空间复杂度 $O(m\times n)$。其中 $m$ 和 $n$ 分别为矩阵的行数和列数。
58+
4959
<!-- tabs:start -->
5060

5161
### **Python3**
5262

5363
<!-- 这里可写当前语言的特殊实现逻辑 -->
5464

5565
```python
56-
66+
class Solution:
67+
def longestLine(self, mat: List[List[int]]) -> int:
68+
m, n = len(mat), len(mat[0])
69+
a = [[0] * (n + 2) for _ in range(m + 2)]
70+
b = [[0] * (n + 2) for _ in range(m + 2)]
71+
c = [[0] * (n + 2) for _ in range(m + 2)]
72+
d = [[0] * (n + 2) for _ in range(m + 2)]
73+
ans = 0
74+
for i in range(1, m + 1):
75+
for j in range(1, n + 1):
76+
if mat[i - 1][j - 1]:
77+
a[i][j] = a[i - 1][j] + 1
78+
b[i][j] = b[i][j - 1] + 1
79+
c[i][j] = c[i - 1][j - 1] + 1
80+
d[i][j] = d[i - 1][j + 1] + 1
81+
ans = max(ans, a[i][j], b[i][j], c[i][j], d[i][j])
82+
return ans
5783
```
5884

5985
### **Java**
6086

6187
<!-- 这里可写当前语言的特殊实现逻辑 -->
6288

6389
```java
90+
class Solution {
91+
public int longestLine(int[][] mat) {
92+
int m = mat.length, n = mat[0].length;
93+
int[][] a = new int[m + 2][n + 2];
94+
int[][] b = new int[m + 2][n + 2];
95+
int[][] c = new int[m + 2][n + 2];
96+
int[][] d = new int[m + 2][n + 2];
97+
int ans = 0;
98+
for (int i = 1; i <= m; ++i) {
99+
for (int j = 1; j <= n; ++j) {
100+
if (mat[i - 1][j - 1] == 1) {
101+
a[i][j] = a[i - 1][j] + 1;
102+
b[i][j] = b[i][j - 1] + 1;
103+
c[i][j] = c[i - 1][j - 1] + 1;
104+
d[i][j] = d[i - 1][j + 1] + 1;
105+
ans = max(ans, a[i][j], b[i][j], c[i][j], d[i][j]);
106+
}
107+
}
108+
}
109+
return ans;
110+
}
111+
112+
private int max(int... arr) {
113+
int ans = 0;
114+
for (int v : arr) {
115+
ans = Math.max(ans, v);
116+
}
117+
return ans;
118+
}
119+
}
120+
```
121+
122+
### **C++**
123+
124+
```cpp
125+
class Solution {
126+
public:
127+
int longestLine(vector<vector<int>>& mat) {
128+
int m = mat.size(), n = mat[0].size();
129+
vector<vector<int>> a(m + 2, vector<int>(n + 2));
130+
vector<vector<int>> b(m + 2, vector<int>(n + 2));
131+
vector<vector<int>> c(m + 2, vector<int>(n + 2));
132+
vector<vector<int>> d(m + 2, vector<int>(n + 2));
133+
int ans = 0;
134+
for (int i = 1; i <= m; ++i) {
135+
for (int j = 1; j <= n; ++j) {
136+
if (mat[i - 1][j - 1]) {
137+
a[i][j] = a[i - 1][j] + 1;
138+
b[i][j] = b[i][j - 1] + 1;
139+
c[i][j] = c[i - 1][j - 1] + 1;
140+
d[i][j] = d[i - 1][j + 1] + 1;
141+
ans = max(ans, max(a[i][j], max(b[i][j], max(c[i][j], d[i][j]))));
142+
}
143+
}
144+
}
145+
return ans;
146+
}
147+
};
148+
```
64149
150+
### **Go**
151+
152+
```go
153+
func longestLine(mat [][]int) (ans int) {
154+
m, n := len(mat), len(mat[0])
155+
f := make([][][4]int, m+2)
156+
for i := range f {
157+
f[i] = make([][4]int, n+2)
158+
}
159+
for i := 1; i <= m; i++ {
160+
for j := 1; j <= n; j++ {
161+
if mat[i-1][j-1] == 1 {
162+
f[i][j][0] = f[i-1][j][0] + 1
163+
f[i][j][1] = f[i][j-1][1] + 1
164+
f[i][j][2] = f[i-1][j-1][2] + 1
165+
f[i][j][3] = f[i-1][j+1][3] + 1
166+
for _, v := range f[i][j] {
167+
if ans < v {
168+
ans = v
169+
}
170+
}
171+
}
172+
}
173+
}
174+
return
175+
}
65176
```
66177

67178
### **...**

solution/0500-0599/0562.Longest Line of Consecutive One in Matrix/README_EN.md

Lines changed: 102 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,114 @@
4141
### **Python3**
4242

4343
```python
44-
44+
class Solution:
45+
def longestLine(self, mat: List[List[int]]) -> int:
46+
m, n = len(mat), len(mat[0])
47+
a = [[0] * (n + 2) for _ in range(m + 2)]
48+
b = [[0] * (n + 2) for _ in range(m + 2)]
49+
c = [[0] * (n + 2) for _ in range(m + 2)]
50+
d = [[0] * (n + 2) for _ in range(m + 2)]
51+
ans = 0
52+
for i in range(1, m + 1):
53+
for j in range(1, n + 1):
54+
if mat[i - 1][j - 1]:
55+
a[i][j] = a[i - 1][j] + 1
56+
b[i][j] = b[i][j - 1] + 1
57+
c[i][j] = c[i - 1][j - 1] + 1
58+
d[i][j] = d[i - 1][j + 1] + 1
59+
ans = max(ans, a[i][j], b[i][j], c[i][j], d[i][j])
60+
return ans
4561
```
4662

4763
### **Java**
4864

4965
```java
66+
class Solution {
67+
public int longestLine(int[][] mat) {
68+
int m = mat.length, n = mat[0].length;
69+
int[][] a = new int[m + 2][n + 2];
70+
int[][] b = new int[m + 2][n + 2];
71+
int[][] c = new int[m + 2][n + 2];
72+
int[][] d = new int[m + 2][n + 2];
73+
int ans = 0;
74+
for (int i = 1; i <= m; ++i) {
75+
for (int j = 1; j <= n; ++j) {
76+
if (mat[i - 1][j - 1] == 1) {
77+
a[i][j] = a[i - 1][j] + 1;
78+
b[i][j] = b[i][j - 1] + 1;
79+
c[i][j] = c[i - 1][j - 1] + 1;
80+
d[i][j] = d[i - 1][j + 1] + 1;
81+
ans = max(ans, a[i][j], b[i][j], c[i][j], d[i][j]);
82+
}
83+
}
84+
}
85+
return ans;
86+
}
87+
88+
private int max(int... arr) {
89+
int ans = 0;
90+
for (int v : arr) {
91+
ans = Math.max(ans, v);
92+
}
93+
return ans;
94+
}
95+
}
96+
```
97+
98+
### **C++**
99+
100+
```cpp
101+
class Solution {
102+
public:
103+
int longestLine(vector<vector<int>>& mat) {
104+
int m = mat.size(), n = mat[0].size();
105+
vector<vector<int>> a(m + 2, vector<int>(n + 2));
106+
vector<vector<int>> b(m + 2, vector<int>(n + 2));
107+
vector<vector<int>> c(m + 2, vector<int>(n + 2));
108+
vector<vector<int>> d(m + 2, vector<int>(n + 2));
109+
int ans = 0;
110+
for (int i = 1; i <= m; ++i) {
111+
for (int j = 1; j <= n; ++j) {
112+
if (mat[i - 1][j - 1]) {
113+
a[i][j] = a[i - 1][j] + 1;
114+
b[i][j] = b[i][j - 1] + 1;
115+
c[i][j] = c[i - 1][j - 1] + 1;
116+
d[i][j] = d[i - 1][j + 1] + 1;
117+
ans = max(ans, max(a[i][j], max(b[i][j], max(c[i][j], d[i][j]))));
118+
}
119+
}
120+
}
121+
return ans;
122+
}
123+
};
124+
```
50125
126+
### **Go**
127+
128+
```go
129+
func longestLine(mat [][]int) (ans int) {
130+
m, n := len(mat), len(mat[0])
131+
f := make([][][4]int, m+2)
132+
for i := range f {
133+
f[i] = make([][4]int, n+2)
134+
}
135+
for i := 1; i <= m; i++ {
136+
for j := 1; j <= n; j++ {
137+
if mat[i-1][j-1] == 1 {
138+
f[i][j][0] = f[i-1][j][0] + 1
139+
f[i][j][1] = f[i][j-1][1] + 1
140+
f[i][j][2] = f[i-1][j-1][2] + 1
141+
f[i][j][3] = f[i-1][j+1][3] + 1
142+
for _, v := range f[i][j] {
143+
if ans < v {
144+
ans = v
145+
}
146+
}
147+
}
148+
}
149+
}
150+
return
151+
}
51152
```
52153

53154
### **...**
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
class Solution {
2+
public:
3+
int longestLine(vector<vector<int>>& mat) {
4+
int m = mat.size(), n = mat[0].size();
5+
vector<vector<int>> a(m + 2, vector<int>(n + 2));
6+
vector<vector<int>> b(m + 2, vector<int>(n + 2));
7+
vector<vector<int>> c(m + 2, vector<int>(n + 2));
8+
vector<vector<int>> d(m + 2, vector<int>(n + 2));
9+
int ans = 0;
10+
for (int i = 1; i <= m; ++i) {
11+
for (int j = 1; j <= n; ++j) {
12+
if (mat[i - 1][j - 1]) {
13+
a[i][j] = a[i - 1][j] + 1;
14+
b[i][j] = b[i][j - 1] + 1;
15+
c[i][j] = c[i - 1][j - 1] + 1;
16+
d[i][j] = d[i - 1][j + 1] + 1;
17+
ans = max(ans, max(a[i][j], max(b[i][j], max(c[i][j], d[i][j]))));
18+
}
19+
}
20+
}
21+
return ans;
22+
}
23+
};
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
func longestLine(mat [][]int) (ans int) {
2+
m, n := len(mat), len(mat[0])
3+
f := make([][][4]int, m+2)
4+
for i := range f {
5+
f[i] = make([][4]int, n+2)
6+
}
7+
for i := 1; i <= m; i++ {
8+
for j := 1; j <= n; j++ {
9+
if mat[i-1][j-1] == 1 {
10+
f[i][j][0] = f[i-1][j][0] + 1
11+
f[i][j][1] = f[i][j-1][1] + 1
12+
f[i][j][2] = f[i-1][j-1][2] + 1
13+
f[i][j][3] = f[i-1][j+1][3] + 1
14+
for _, v := range f[i][j] {
15+
if ans < v {
16+
ans = v
17+
}
18+
}
19+
}
20+
}
21+
}
22+
return
23+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
class Solution {
2+
public int longestLine(int[][] mat) {
3+
int m = mat.length, n = mat[0].length;
4+
int[][] a = new int[m + 2][n + 2];
5+
int[][] b = new int[m + 2][n + 2];
6+
int[][] c = new int[m + 2][n + 2];
7+
int[][] d = new int[m + 2][n + 2];
8+
int ans = 0;
9+
for (int i = 1; i <= m; ++i) {
10+
for (int j = 1; j <= n; ++j) {
11+
if (mat[i - 1][j - 1] == 1) {
12+
a[i][j] = a[i - 1][j] + 1;
13+
b[i][j] = b[i][j - 1] + 1;
14+
c[i][j] = c[i - 1][j - 1] + 1;
15+
d[i][j] = d[i - 1][j + 1] + 1;
16+
ans = max(ans, a[i][j], b[i][j], c[i][j], d[i][j]);
17+
}
18+
}
19+
}
20+
return ans;
21+
}
22+
23+
private int max(int... arr) {
24+
int ans = 0;
25+
for (int v : arr) {
26+
ans = Math.max(ans, v);
27+
}
28+
return ans;
29+
}
30+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
class Solution:
2+
def longestLine(self, mat: List[List[int]]) -> int:
3+
m, n = len(mat), len(mat[0])
4+
a = [[0] * (n + 2) for _ in range(m + 2)]
5+
b = [[0] * (n + 2) for _ in range(m + 2)]
6+
c = [[0] * (n + 2) for _ in range(m + 2)]
7+
d = [[0] * (n + 2) for _ in range(m + 2)]
8+
ans = 0
9+
for i in range(1, m + 1):
10+
for j in range(1, n + 1):
11+
v = mat[i - 1][j - 1]
12+
if v:
13+
a[i][j] = a[i - 1][j] + 1
14+
b[i][j] = b[i][j - 1] + 1
15+
c[i][j] = c[i - 1][j - 1] + 1
16+
d[i][j] = d[i - 1][j + 1] + 1
17+
ans = max(ans, a[i][j], b[i][j], c[i][j], d[i][j])
18+
return ans

solution/0800-0899/0808.Soup Servings/README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@
5555

5656
**方法一:记忆化搜索**
5757

58-
在这道题中,由于每次操作都是 $25$ 的倍数,因此,我们可以将每 $25ml$ 的汤视为一份。这样就能将数据规模缩小到 $\left \lceil \frac{n}{25} \right \rceil $。
58+
在这道题中,由于每次操作都是 $25$ 的倍数,因此,我们可以将每 $25ml$ 的汤视为一份。这样就能将数据规模缩小到 $\left \lceil \frac{n}{25} \right \rceil$。
5959

6060
我们设计一个函数 $dfs(i, j)$,表示当前剩余 $i$ 份汤 $A$ 和 $j$ 份汤 $B$ 的结果概率。
6161

@@ -76,7 +76,7 @@ $$
7676

7777
记忆化搜索即可。
7878

79-
另外,我们发现在 $n=4800$ 时,结果为 $0.999994994426$,而题目要求的精度为 $10^{-5}$,并且随着 $n$ 的增大,结果越来越接近 $1$,因此,当 $n \ge 4800$ 时,直接返回 $1$ 即可。
79+
另外,我们发现在 $n=4800$ 时,结果为 $0.999994994426$,而题目要求的精度为 $10^{-5}$,并且随着 $n$ 的增大,结果越来越接近 $1$,因此,当 $n \gt 4800$ 时,直接返回 $1$ 即可。
8080

8181
时间复杂度 $O(C^2)$,空间复杂度 $O(C^2)$。本题中 $C=200$。
8282

0 commit comments

Comments
 (0)