algorithm-base/animation-simulation/数组篇/leetcode59螺旋矩阵2.md

379 lines
11 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

> **[tan45du_one](https://raw.githubusercontent.com/tan45du/tan45du.github.io/master/个人微信.15egrcgqd94w.jpg)** ,备注 github + 题目 + 问题 向我反馈
>
>
>
> <u>[****](https://raw.githubusercontent.com/tan45du/test/master/微信图片_20210320152235.2pthdebvh1c0.png)</u> 两个平台同步,想要和题友一起刷题,互相监督的同学,可以在我的小屋点击<u>[**刷题小队**](https://raw.githubusercontent.com/tan45du/test/master/微信图片_20210320152235.2pthdebvh1c0.png)</u>进入。
### [59. II](https://leetcode-cn.com/problems/spiral-matrix-ii)
`n` `1` `n2` `n x n` `matrix`
** 1**
> n = 3
> [[1,2,3],[8,9,4],[7,6,5]]
** 2**
> n = 1
> [[1]]
**leetcode 54**
### leetcode 54
* m* x nm , n
> matrix = [[1,2,3],[4,5,6],[7,8,9]]
> [1,2,3,6,9,8,7,4,5]
> matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
> [1,2,3,4,8,12,11,10,9,5,6,7]
*![](https://pic.leetcode-cn.com/1615813563-uUiWlF-file_1615813563382)*
![](https://img-blog.csdnimg.cn/20210318095839543.gif)
Java Code:
```java
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> arr = new ArrayList<>();
int left = 0, right = matrix[0].length-1;
int top = 0, down = matrix.length-1;
while (true) {
for (int i = left; i <= right; ++i) {
arr.add(matrix[top][i]);
}
top++;
if (top > down) break;
for (int i = top; i <= down; ++i) {
arr.add(matrix[i][right]);
}
right--;
if (left > right) break;
for (int i = right; i >= left; --i) {
arr.add(matrix[down][i]);
}
down--;
if (top > down) break;
for (int i = down; i >= top; --i) {
arr.add(matrix[i][left]);
}
left++;
if (left > right) break;
}
return arr;
}
}
```
Python3 Code:
```python
from typing import List
class Solution:
def spiralOrder(self, matrix: List[List[int]])->List[int]:
arr = []
left = 0
right = len(matrix[0]) - 1
top = 0
down = len(matrix) - 1
while True:
for i in range(left, right + 1):
arr.append(matrix[top][i])
top += 1
if top > down:
break
for i in range(top, down + 1):
arr.append(matrix[i][right])
right -= 1
if left > right:
break
for i in range(right, left - 1, -1):
arr.append(matrix[down][i])
down -= 1
if top > down:
break
for i in range(down, top - 1, -1):
arr.append(matrix[i][left])
left += 1
if left > right:
break
return arr
```
C++ Code:
```cpp
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector <int> arr;
int left = 0, right = matrix[0].size()-1;
int top = 0, down = matrix.size()-1;
while (true) {
for (int i = left; i <= right; ++i) {
arr.emplace_back(matrix[top][i]);
}
top++;
if (top > down) break;
for (int i = top; i <= down; ++i) {
arr.emplace_back(matrix[i][right]);
}
right--;
if (left > right) break;
for (int i = right; i >= left; --i) {
arr.emplace_back(matrix[down][i]);
}
down--;
if (top > down) break;
for (int i = down; i >= top; --i) {
arr.emplace_back(matrix[i][left]);
}
left++;
if (left > right) break;
}
return arr;
}
};
```
Swift Code:
```swift
class Solution {
func spiralOrder(_ matrix: [[Int]]) -> [Int] {
var arr:[Int] = []
var left = 0, right = matrix[0].count - 1
var top = 0, down = matrix.count - 1
while (true) {
for i in left...right {
arr.append(matrix[top][i])
}
top += 1
if top > down { break }
for i in top...down {
arr.append(matrix[i][right])
}
right -= 1
if left > right { break}
for i in stride(from: right, through: left, by: -1) {
arr.append(matrix[down][i])
}
down -= 1
if top > down { break}
for i in stride(from: down, through: top, by: -1) {
arr.append(matrix[i][left])
}
left += 1
if left > right { break}
}
return arr
}
}
```
54 ,
Java Code:
```java
class Solution {
public int[][] generateMatrix(int n) {
int[][] arr = new int[n][n];
int left = 0;
int right = n-1;
int top = 0;
int buttom = n-1;
int num = 1;
int numsize = n*n;
while (true) {
for (int i = left; i <= right; ++i) {
arr[top][i] = num++;
}
top++;
if (num > numsize) break;
for (int i = top; i <= buttom; ++i) {
arr[i][right] = num++;
}
right--;
if (num > numsize) break;
for (int i = right; i >= left; --i) {
arr[buttom][i] = num++;
}
buttom--;
if (num > numsize) break;
for (int i = buttom; i >= top; --i) {
arr[i][left] = num++;
}
left++;
if (num > numsize) break;
}
return arr;
}
}
```
Python3 Code:
```python
from typing import List
import numpy as np
class Solution:
def generateMatrix(self, n: int)->List[List[int]]:
arr = np.array([[0] * n] * n)
left = 0
right = n - 1
top = 0
buttom = n - 1
num = 1
numsize = n * n
while True:
for i in range(left, right + 1):
arr[top][i] = num
num += 1
top += 1
if num > numsize:
break
for i in range(top, buttom + 1):
arr[i][right] = num
num += 1
right -= 1
if num > numsize:
break
for i in range(right, left - 1, -1):
arr[buttom][i] = num
num += 1
buttom -= 1
if num > numsize:
break
for i in range(buttom, top - 1, -1):
arr[i][left] = num
num += 1
left += 1
if num > numsize:
break
return arr.tolist()
```
C++ Code:
```cpp
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector <vector <int>> arr(n, vector <int>(n));
int left = 0, right = n-1, top = 0, buttom = n - 1, num = 1, numsize = n * n;
while (true) {
for (int i = left; i <= right; ++i) {
arr[top][i] = num++;
}
top++;
if (num > numsize) break;
for (int i = top; i <= buttom; ++i) {
arr[i][right] = num++;
}
right--;
if (num > numsize) break;
for (int i = right; i >= left; --i) {
arr[buttom][i] = num++;
}
buttom--;
if (num > numsize) break;
for (int i = buttom; i >= top; --i) {
arr[i][left] = num++;
}
left++;
if (num > numsize) break;
}
return arr;
}
};
```
Swift Code:
```swift
class Solution {
func generateMatrix(_ n: Int) -> [[Int]] {
var arr:[[Int]] = Array.init(repeating: Array.init(repeating: 0, count: n), count: n)
var left = 0, right = n - 1
var top = 0, bottom = n - 1
var num = 1, numSize = n * n
while true {
for i in left...right {
arr[top][i] = num
num += 1
}
top += 1
if num > numSize { break}
for i in top...bottom {
arr[i][right] = num
num += 1
}
right -= 1
if num > numSize { break}
for i in stride(from: right, through: left, by: -1) {
arr[bottom][i] = num
num += 1
}
bottom -= 1
if num > numSize { break}
for i in stride(from: bottom, through: top, by: -1) {
arr[i][left] = num
num += 1
}
left += 1
if num > numSize { break}
}
return arr
}
}
```