【杂题】剑指 Offer 29. 顺时针打印矩阵

本问题对应课程链接:剑指offer刷题第四期

要求:

1、请打卡你的解题代码,如果能简单说一下思路则简单说一下思路。
2、给出你代码所用的时间复杂度和空间复杂度

共以下 7 个回答

  • hi 普通 2024年1月2日 下午3:14
    1. 用原坐标的偏移量去表示右、下、左、上的移动
    2. 先判断是否为空再进行n, m的赋值,不然出现对空数组访问的错误
    class Solution {
    public:
        vector<int> spiralArray(vector<vector<int>>& array) {
            vector<int> res; //答案数组
            if(array.size() == 0 || array[0].size() == 0) return res;
            int n = array.size(), m = array[0].size();
            vector<vector<bool>> st(n, vector<bool>(m));      
    
            int dx[] = {0, 1, 0, -1}, dy[] = {1, 0, -1, 0}; //0表示不变
            for(int i = 0, x = 0, y = 0, d = 0; i < n * m; i++){
                res.push_back(array[x][y]);
                st[x][y] = true;
    
                int a = x + dx[d], b = y + dy[d]; //得到下一步到达的坐标位置
                //如果坐标出界或者到达的那个坐标已经访问过,需要改变方向
                if(a < 0 || a >= n || b < 0 || b >= m || st[a][b]){
                    d = (d + 1) % 4; //4循环选 个方向
                    a = x + dx[d], b = y + dy[d];
                }
    
                x = a, y = b;
            }
    
            return res;
        }
    };
    
    0 赞同 0 条回复
  • Marshan 普通 2023年9月12日 下午10:00

    定义上下左右四个边界,每次遍历一行或一列以后将边界进行相应调整。

    class Solution {
    public:
        vector<int> spiralOrder(vector<vector<int>>& matrix) {
            if(matrix.size() == 0){
                return {};
            }
            int l = 0,r = matrix[0].size() - 1,t = 0,b = matrix.size() - 1;
            vector<int> res;
            while(true){
                for(int i = l;i <= r;++i){
                    res.push_back(matrix[t][i]);
                }
                if(++t > b){
                    break;
                }
                for(int i = t;i <= b;++i){
                    res.push_back(matrix[i][r]);
                }
                if(l > --r){
                    break;
                }
                for(int i = r;i >= l;--i){
                    res.push_back(matrix[b][i]);
                }
                if(t > --b){
                    break;
                }
                for(int i = b;i >= t;--i){
                    res.push_back(matrix[i][l]);
                }
                if(++l > r){
                    break;
                }
            }
            return res;
        }
    };
    
    0 赞同 0 条回复
  • Mby 普通 2023年8月22日 下午2:42
    class Solution {
        public int[] spiralOrder(int[][] matrix) {
            //从左向右、从上向下、从右向左、从下向上循环
            if(matrix.length == 0) return new int[0];
            int l = 0, r = matrix[0].length-1, t = 0, b = matrix.length - 1, x = 0;
            int[] res = new int[(r + 1) * (b + 1)];
            while(true){
                for(int i = l; i <= r; i++) res[x++] = matrix[t][i];// left to right
                if(++t > b) break;
                for(int i = t; i <= b; i++) res[x++] = matrix[i][r];// top to bottom
                if(l > --r) break;
                for(int i = r; i >= l; i--) res[x++] = matrix[b][i];//right to left
                if(t > --b) break;
                for(int i = b; i >= t; i--) res[x++] = matrix[i][l];//bottom to top
                if(++l > r) break;
            }
            return res;
        }
    }
    
    0 赞同 0 条回复
  • 阿尚 普通 2023年8月12日 下午9:38
    class Solution {
        public int[] spiralOrder(int[][] matrix) {
            if(matrix == null || matrix.length == 0) return new int[0];
            int m = matrix.length;
            int n = matrix[0].length;
            int[] result = new int[m * n];
    
            int index = 0;
    
            //坐标定义
            int rb = 0;
            int cb = 0;
            int re = m - 1;
            int ce = n - 1;
    
            while(rb <= re && cb <= ce){
                if(rb == re){
                    for(int j = cb; j <= ce; j++){
                        result[index++] = matrix[rb][j];
                    }
                }else if(cb == ce){
                    for(int i = rb; i <= re; i++){
                        result[index++] = matrix[i][cb];
                    }
                }else{
                    for(int j = cb; j < ce; j++){
                        result[index++] = matrix[rb][j];
                    }
    
                    for(int i = rb; i < re; i++){
                        result[index++] = matrix[i][ce];
                    }
    
                    for(int j = ce; j > cb; j--){
                        result[index++] = matrix[re][j];
                    }
    
                    for(int i = re; i > rb; i--){
                        result[index++] = matrix[i][cb];
                    }
                }
                rb++;
                cb++;
                re--;
                ce--;
            }
    
            return result;
        }
    }
    
    0 赞同 0 条回复
  • 长河呼叫黄江 普通 2023年8月12日 下午3:30

    8.10 周四
    Day31:下面是代码

    class Solution {
        public int[] spiralOrder(int[][] matrix) {
            if(matrix.length == 0) return new int[0];
            int l = 0, r = matrix[0].length - 1, t = 0, b = matrix.length - 1, x = 0;
            int[] res = new int[(r + 1) * (b + 1)];
            //左右移动代表列坐标变化,上下移动代表行坐标变化
            while(true){
                for(int i = l; i <= r; i++) {
                    res[x++] = matrix[t][i];
                }
                if(++t > b) break;
                for(int i = t; i <= b; i++){
                    res[x++] = matrix[i][r];
                }
                if(l > --r) break;
                for(int i = r; i >= l; i--){
                    res[x++] = matrix[b][i];
                }
                if(t > --b) break;
                for(int i = b; i >= t; i--){
                    res[x++] = matrix[i][l];
                }
                if(++l > r) break;
            }
            return res;
        }
    }
    
    
    0 赞同 0 条回复
  • NullPointerException 普通 2023年8月11日 下午5:57

    class Solution {
    public int[] spiralOrder(int[][] matrix) {
    //经典顺序遍历 上下左右四个范围
    if(matrixnull||matrix.length0) return new int[0];
    int high = 0;
    int low =matrix.length-1;
    int left = 0;
    int right = matrix[0].length -1;
    int result[] = new int[matrix.length*matrix[0].length];
    int a=0;
    while(true)
    {
    for(int i=left;i<=right;i++)
    {
    result[a++]=matrix[high][i];
    }
    if(++high>low) break;

            for(int i=high;i<=low;i++)
                {
                    result[a++]=matrix[i][right];
                }
                if(--right<left) break;
    
                for(int i=right;i>=left;i--)
                {
                    result[a++]=matrix[low][i];
                }
                if(--low<high) break;
    
                for(int i=low;i>=high;i--)
                {
                    result[a++]=matrix[i][left];
    
                }
                if(++left>right)break;
    
    
            }
            return result;
    }
    

    }

    0 赞同 0 条回复
  • AD钙奶 普通 2023年8月11日 上午11:48

    有点绕

    class Solution {
        public int[] spiralOrder(int[][] mat) {
            int n = mat.length;
            if(n == 0) {
                return new int[0];
            }
            int m = mat[0].length;
            int k = 0;
            int[] res = new int[n * m];
            int left = 0, right = m - 1, up = 0, down = n - 1;
            while(left <= right && up <= down) {
                for(int i = left; i <= right; i ++) {
                    res[k ++] = mat[up][i];
                }
                up ++;
                for(int i = up; i <= down; i ++) {
                    res[k ++] = mat[i][right];
                }
                right --;
                for(int i = right; i >= left && up <= down; i --) {
                    res[k ++] = mat[down][i];
                }
                down --;
                for(int i = down; i >= up && left <= right; i --) {
                    res[k ++] = mat[i][left];
                }
                left ++;
            }
            return res; 
        }
    }
    
    0 赞同 0 条回复

# 回答此问题

后才能回答