螺旋矩阵#力扣

54. 螺旋矩阵

给你一个 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
}

你可能感兴趣的:(C/C++备战蓝桥杯,leetcode,矩阵,算法)