给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
示例 2:
输入: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]
提示:
m == matrix.length n == matrix[i].length 1 <= m, n <= 10, -100 <= matrix[i][j] <= 100
C语言题解
int* spiralOrder(int** matrix, int matrixSize, int* matrixColSize, int* returnSize){
if(matrixSize == 0 || *matrixColSize == 0) {
*returnSize = 0;
return NULL;
}
*returnSize = matrixSize * (*matrixColSize);
int* ret = (int*)malloc(sizeof(int) * (*returnSize));
int m = matrixSize, n = *matrixColSize;
// 设定方向向量
int dx[] = {0, 1, 0, -1},dy[] = {1, 0, -1, 0};
// 判断当前数字有没有被使用,也就是有没有加到答案数组里面
int st[m][n];
memset(st, 0, sizeof(st));
// x和y表示的是当前循环到了哪个坐标,dir表示当前的方向
int x = 0, y = 0, dir = 0;
for(int i = 0; i < *returnSize; i++) {
ret[i] = matrix[x][y];
st[x][y] = 1;
int a = x + dx[dir], b = y + dy[dir];
// 检查下一个方向是否出界或者已经访问过,如果是则转向
if(a < 0 || a >= m || b < 0 || b >= n || st[a][b]) {
dir = (dir + 1) % 4;
a = x + dx[dir];
b = y + dy[dir];
}
x = a;
y = b;
}
return ret;
}
C++题解
class Solution {
public:
vector spiralOrder(vector>& matrix) {
if(matrix.empty() || matrix[0].empty()) {
return {};
}
vector ret;
int m = matrix.size(), n = matrix[0].size();
int dx[] = {0, 1, 0, -1};
int dy[] = {1, 0, -1, 0};
vector> st(m, vector(n, false));
int x = 0, y = 0, dir = 0;
for(int i = 0; i < m * n; i++) {
ret.push_back(matrix[x][y]);
st[x][y] = true;
int a = x + dx[dir], b = y + dy[dir];
if(a < 0 || a >= m || b < 0 || b >= n || st[a][b]) {
dir = (dir + 1) % 4;
a = x + dx[dir];
b = y + dy[dir];
}
x = a;
y = b;
}
return ret;
}
};
Go题解
func spiralOrder(matrix [][]int) []int {
if len(matrix) == 0 || len(matrix[0]) == 0 {
return []int{}
}
//行,列
m, n := len(matrix), len(matrix[0])
var ret []int
//[]bool 类型的切片里面的默认值是false
st:=make([][]bool,m)//m=3时,[[] [] []],一个切片里有三个nil切片
for i:=range st{
st[i]=make([]bool,n)//n=2时,[[false false] [false false] [false false]]
}
dir := [][]int{
{0, 1}, // 右
{1, 0}, // 下
{0, -1}, // 左
{-1, 0}, // 上
}
x, y, d := 0, 0, 0
for i := 0; i < m*n; i++ {
ret = append(ret, matrix[x][y])
st[x][y] = true
a, b := x + dir[d][0], y + dir[d][1]
//判断是否越界,如果越界走下一个方向
if a >= m || a < 0 || b >= n || b < 0 || st[a][b] {
d = (d + 1) % 4
a, b = x + dir[d][0], y + dir[d][1]
}
x, y = a, b
}
return ret
}