Skip to content

Commit 988caec

Browse files
authored
feat: add solutions to lc problem: No.0054 (#3897)
No.0054.Spiral Matrix
1 parent 1a6ab2a commit 988caec

33 files changed

+621
-1123
lines changed

solution/0000-0099/0054.Spiral Matrix/README.md

+125-319
Large diffs are not rendered by default.

solution/0000-0099/0054.Spiral Matrix/README_EN.md

+125-319
Large diffs are not rendered by default.

solution/0000-0099/0054.Spiral Matrix/Solution.cs

+6-5
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
public class Solution {
22
public IList<int> SpiralOrder(int[][] matrix) {
33
int m = matrix.Length, n = matrix[0].Length;
4-
int[] dirs = new int[] {0, 1, 0, -1, 0};
4+
int[] dirs = { 0, 1, 0, -1, 0 };
5+
int i = 0, j = 0, k = 0;
56
IList<int> ans = new List<int>();
6-
bool[,] visited = new bool[m, n];
7-
for (int h = m * n, i = 0, j = 0, k = 0; h > 0; --h) {
7+
bool[,] vis = new bool[m, n];
8+
for (int h = m * n; h > 0; --h) {
89
ans.Add(matrix[i][j]);
9-
visited[i, j] = true;
10+
vis[i, j] = true;
1011
int x = i + dirs[k], y = j + dirs[k + 1];
11-
if (x < 0 || x >= m || y < 0 || y >= n || visited[x, y]) {
12+
if (x < 0 || x >= m || y < 0 || y >= n || vis[x, y]) {
1213
k = (k + 1) % 4;
1314
}
1415
i += dirs[k];

solution/0000-0099/0054.Spiral Matrix/Solution.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,4 @@ public List<Integer> spiralOrder(int[][] matrix) {
1717
}
1818
return ans;
1919
}
20-
}
20+
}

solution/0000-0099/0054.Spiral Matrix/Solution.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ var spiralOrder = function (matrix) {
66
const m = matrix.length;
77
const n = matrix[0].length;
88
const ans = [];
9-
const vis = new Array(m).fill(0).map(() => new Array(n).fill(false));
9+
const vis = Array.from({ length: m }, () => Array(n).fill(false));
1010
const dirs = [0, 1, 0, -1, 0];
1111
for (let h = m * n, i = 0, j = 0, k = 0; h > 0; --h) {
1212
ans.push(matrix[i][j]);

solution/0000-0099/0054.Spiral Matrix/Solution.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@ class Solution:
22
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
33
m, n = len(matrix), len(matrix[0])
44
dirs = (0, 1, 0, -1, 0)
5+
vis = [[False] * n for _ in range(m)]
56
i = j = k = 0
67
ans = []
7-
vis = set()
88
for _ in range(m * n):
99
ans.append(matrix[i][j])
10-
vis.add((i, j))
10+
vis[i][j] = True
1111
x, y = i + dirs[k], j + dirs[k + 1]
12-
if not 0 <= x < m or not 0 <= y < n or (x, y) in vis:
12+
if x < 0 or x >= m or y < 0 or y >= n or vis[x][y]:
1313
k = (k + 1) % 4
14-
i = i + dirs[k]
15-
j = j + dirs[k + 1]
14+
i += dirs[k]
15+
j += dirs[k + 1]
1616
return ans
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,28 @@
11
impl Solution {
22
pub fn spiral_order(matrix: Vec<Vec<i32>>) -> Vec<i32> {
3-
let mut x1 = 0;
4-
let mut y1 = 0;
5-
let mut x2 = matrix.len() - 1;
6-
let mut y2 = matrix[0].len() - 1;
7-
let mut result = vec![];
3+
let m = matrix.len();
4+
let n = matrix[0].len();
5+
let mut dirs = vec![0, 1, 0, -1, 0];
6+
let mut vis = vec![vec![false; n]; m];
7+
let mut i = 0;
8+
let mut j = 0;
9+
let mut k = 0;
10+
let mut ans = Vec::new();
811

9-
while x1 <= x2 && y1 <= y2 {
10-
for j in y1..=y2 {
11-
result.push(matrix[x1][j]);
12-
}
13-
for i in x1 + 1..=x2 {
14-
result.push(matrix[i][y2]);
15-
}
16-
if x1 < x2 && y1 < y2 {
17-
for j in (y1..y2).rev() {
18-
result.push(matrix[x2][j]);
19-
}
20-
for i in (x1 + 1..x2).rev() {
21-
result.push(matrix[i][y1]);
22-
}
23-
}
24-
x1 += 1;
25-
y1 += 1;
26-
if x2 != 0 {
27-
x2 -= 1;
28-
}
29-
if y2 != 0 {
30-
y2 -= 1;
12+
for _ in 0..(m * n) {
13+
ans.push(matrix[i][j]);
14+
vis[i][j] = true;
15+
let x = i as i32 + dirs[k] as i32;
16+
let y = j as i32 + dirs[k + 1] as i32;
17+
18+
if x < 0 || x >= m as i32 || y < 0 || y >= n as i32 || vis[x as usize][y as usize] {
19+
k = (k + 1) % 4;
3120
}
21+
22+
i = (i as i32 + dirs[k] as i32) as usize;
23+
j = (j as i32 + dirs[k + 1] as i32) as usize;
3224
}
33-
return result;
25+
26+
ans
3427
}
3528
}

solution/0000-0099/0054.Spiral Matrix/Solution.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ function spiralOrder(matrix: number[][]): number[] {
22
const m = matrix.length;
33
const n = matrix[0].length;
44
const ans: number[] = [];
5-
const vis = new Array(m).fill(0).map(() => new Array(n).fill(false));
5+
const vis: boolean[][] = Array.from({ length: m }, () => Array(n).fill(false));
66
const dirs = [0, 1, 0, -1, 0];
77
for (let h = m * n, i = 0, j = 0, k = 0; h > 0; --h) {
88
ans.push(matrix[i][j]);
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,25 @@
1-
class Solution {
2-
public:
3-
vector<int> spiralOrder(vector<vector<int>>& matrix) {
4-
int m = matrix.size(), n = matrix[0].size();
5-
int dirs[5] = {0, 1, 0, -1, 0};
6-
vector<int> ans;
7-
for (int h = m * n, i = 0, j = 0, k = 0; h; --h) {
8-
ans.push_back(matrix[i][j]);
9-
matrix[i][j] += 300;
10-
int x = i + dirs[k], y = j + dirs[k + 1];
11-
if (x < 0 || x >= m || y < 0 || y >= n || matrix[x][y] > 100) {
12-
k = (k + 1) % 4;
13-
}
14-
i += dirs[k];
15-
j += dirs[k + 1];
16-
}
17-
// for (int i = 0; i < m; ++i) {
18-
// for (int j = 0; j < n; ++j) {
19-
// matrix[i][j] -= 300;
20-
// }
21-
// }
22-
return ans;
23-
}
24-
};
1+
class Solution {
2+
public:
3+
vector<int> spiralOrder(vector<vector<int>>& matrix) {
4+
int m = matrix.size(), n = matrix[0].size();
5+
int dirs[5] = {0, 1, 0, -1, 0};
6+
int i = 0, j = 0, k = 0;
7+
vector<int> ans;
8+
for (int h = m * n; h; --h) {
9+
ans.push_back(matrix[i][j]);
10+
matrix[i][j] += 300;
11+
int x = i + dirs[k], y = j + dirs[k + 1];
12+
if (x < 0 || x >= m || y < 0 || y >= n || matrix[x][y] > 100) {
13+
k = (k + 1) % 4;
14+
}
15+
i += dirs[k];
16+
j += dirs[k + 1];
17+
}
18+
for (i = 0; i < m; ++i) {
19+
for (j = 0; j < n; ++j) {
20+
matrix[i][j] -= 300;
21+
}
22+
}
23+
return ans;
24+
}
25+
};
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,24 @@
1-
public class Solution {
2-
public IList<int> SpiralOrder(int[][] matrix) {
3-
int m = matrix.Length, n = matrix[0].Length;
4-
int[] dirs = new int[] {0, 1, 0, -1, 0};
5-
IList<int> ans = new List<int>();
6-
for (int h = m * n, i = 0, j = 0, k = 0; h > 0; --h) {
7-
ans.Add(matrix[i][j]);
8-
matrix[i][j] += 300;
9-
int x = i + dirs[k], y = j + dirs[k + 1];
10-
if (x < 0 || x >= m || y < 0 || y >= n || matrix[x][y] > 100) {
11-
k = (k + 1) % 4;
12-
}
13-
i += dirs[k];
14-
j += dirs[k + 1];
15-
}
16-
for (int i = 0; i < m; ++i) {
17-
for (int j = 0; j < n; ++j) {
18-
matrix[i][j] -= 300;
19-
}
20-
}
21-
return ans;
22-
}
23-
}
1+
public class Solution {
2+
public IList<int> SpiralOrder(int[][] matrix) {
3+
int m = matrix.Length, n = matrix[0].Length;
4+
int[] dirs = { 0, 1, 0, -1, 0 };
5+
int i = 0, j = 0, k = 0;
6+
IList<int> ans = new List<int>();
7+
for (int h = m * n; h > 0; --h) {
8+
ans.Add(matrix[i][j]);
9+
matrix[i][j] += 300;
10+
int x = i + dirs[k], y = j + dirs[k + 1];
11+
if (x < 0 || x >= m || y < 0 || y >= n || matrix[x][y] > 100) {
12+
k = (k + 1) % 4;
13+
}
14+
i += dirs[k];
15+
j += dirs[k + 1];
16+
}
17+
for (int a = 0; a < m; ++a) {
18+
for (int b = 0; b < n; ++b) {
19+
matrix[a][b] -= 300;
20+
}
21+
}
22+
return ans;
23+
}
24+
}
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,20 @@
1-
func spiralOrder(matrix [][]int) (ans []int) {
2-
m, n := len(matrix), len(matrix[0])
3-
dirs := [5]int{0, 1, 0, -1, 0}
4-
for h, i, j, k := m*n, 0, 0, 0; h > 0; h-- {
5-
ans = append(ans, matrix[i][j])
6-
matrix[i][j] += 300
7-
x, y := i+dirs[k], j+dirs[k+1]
8-
if x < 0 || x >= m || y < 0 || y >= n || matrix[x][y] > 100 {
9-
k = (k + 1) % 4
10-
}
11-
i, j = i+dirs[k], j+dirs[k+1]
12-
}
13-
// for i, row := range matrix {
14-
// for j := range row {
15-
// matrix[i][j] -= 300
16-
// }
17-
// }
18-
return
19-
}
1+
func spiralOrder(matrix [][]int) (ans []int) {
2+
m, n := len(matrix), len(matrix[0])
3+
dirs := [5]int{0, 1, 0, -1, 0}
4+
i, j, k := 0, 0, 0
5+
for h := m * n; h > 0; h-- {
6+
ans = append(ans, matrix[i][j])
7+
matrix[i][j] += 300
8+
x, y := i+dirs[k], j+dirs[k+1]
9+
if x < 0 || x >= m || y < 0 || y >= n || matrix[x][y] > 100 {
10+
k = (k + 1) % 4
11+
}
12+
i, j = i+dirs[k], j+dirs[k+1]
13+
}
14+
for i = 0; i < m; i++ {
15+
for j = 0; j < n; j++ {
16+
matrix[i][j] -= 300
17+
}
18+
}
19+
return
20+
}
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,24 @@
1-
class Solution {
2-
public List<Integer> spiralOrder(int[][] matrix) {
3-
int m = matrix.length, n = matrix[0].length;
4-
int[] dirs = {0, 1, 0, -1, 0};
5-
List<Integer> ans = new ArrayList<>();
6-
for (int h = m * n, i = 0, j = 0, k = 0; h > 0; --h) {
7-
ans.add(matrix[i][j]);
8-
matrix[i][j] += 300;
9-
int x = i + dirs[k], y = j + dirs[k + 1];
10-
if (x < 0 || x >= m || y < 0 || y >= n || matrix[x][y] > 100) {
11-
k = (k + 1) % 4;
12-
}
13-
i += dirs[k];
14-
j += dirs[k + 1];
15-
}
16-
// for (int i = 0; i < m; ++i) {
17-
// for (int j = 0; j < n; ++j) {
18-
// matrix[i][j] -= 300;
19-
// }
20-
// }
21-
return ans;
22-
}
23-
}
1+
class Solution {
2+
public List<Integer> spiralOrder(int[][] matrix) {
3+
int m = matrix.length, n = matrix[0].length;
4+
int[] dirs = {0, 1, 0, -1, 0};
5+
int i = 0, j = 0, k = 0;
6+
List<Integer> ans = new ArrayList<>();
7+
for (int h = m * n; h > 0; --h) {
8+
ans.add(matrix[i][j]);
9+
matrix[i][j] += 300;
10+
int x = i + dirs[k], y = j + dirs[k + 1];
11+
if (x < 0 || x >= m || y < 0 || y >= n || matrix[i][j] > 100) {
12+
k = (k + 1) % 4;
13+
}
14+
i += dirs[k];
15+
j += dirs[k + 1];
16+
}
17+
for (int i = 0; i < m; ++i) {
18+
for (int j = 0; j < n; ++j) {
19+
matrix[i][j] -= 300;
20+
}
21+
}
22+
return ans;
23+
}
24+
}

solution/0000-0099/0054.Spiral Matrix/Solution2.js

+5-5
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@ var spiralOrder = function (matrix) {
1818
i += dirs[k];
1919
j += dirs[k + 1];
2020
}
21-
// for (let i = 0; i < m; ++i) {
22-
// for (let j = 0; j < n; ++j) {
23-
// matrix[i][j] -= 300;
24-
// }
25-
// }
21+
for (let i = 0; i < m; ++i) {
22+
for (let j = 0; j < n; ++j) {
23+
matrix[i][j] -= 300;
24+
}
25+
}
2626
return ans;
2727
};
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
1-
class Solution:
2-
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
3-
m, n = len(matrix), len(matrix[0])
4-
dirs = (0, 1, 0, -1, 0)
5-
i = j = k = 0
6-
ans = []
7-
for _ in range(m * n):
8-
ans.append(matrix[i][j])
9-
matrix[i][j] += 300
10-
x, y = i + dirs[k], j + dirs[k + 1]
11-
if not 0 <= x < m or not 0 <= y < n or matrix[x][y] > 100:
12-
k = (k + 1) % 4
13-
i = i + dirs[k]
14-
j = j + dirs[k + 1]
15-
# for i in range(m):
16-
# for j in range(n):
17-
# matrix[i][j] -= 300
18-
return ans
1+
class Solution:
2+
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
3+
m, n = len(matrix), len(matrix[0])
4+
dirs = (0, 1, 0, -1, 0)
5+
i = j = k = 0
6+
ans = []
7+
for _ in range(m * n):
8+
ans.append(matrix[i][j])
9+
matrix[i][j] += 300
10+
x, y = i + dirs[k], j + dirs[k + 1]
11+
if x < 0 or x >= m or y < 0 or y >= n or matrix[x][y] > 100:
12+
k = (k + 1) % 4
13+
i += dirs[k]
14+
j += dirs[k + 1]
15+
for i in range(m):
16+
for j in range(n):
17+
matrix[i][j] -= 300
18+
return ans

0 commit comments

Comments
 (0)