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

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

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

共以下 9 个回答

  • 九号球 普通 2023年12月7日 上午8:23

    “`java
    class Solution {
    public int[] spiralArray(int[][] array) {
    if (array == null || array.length == 0 || array[0].length == 0) {
    return new int[0];
    }
    int l = 0, r = array[0].length – 1, t = 0, b = array.length – 1;
    int length = (r + 1)*(b + 1);
    int[] res = new int[(r + 1)*(b + 1)];
    int k = 0;
    while (k < length) { //从左到右 for (int i = t, j = l; j <= r; j++) { res[k++] = array[i][j]; } if (++t > b) {
    break;
    }
    //从上到下
    for (int i = t, j = r; i <= b; i++) { res[k++] = array[i][j]; } if (--r < l) { break; } //从右到左 for (int i = b, j = r; j >= l; j–) {
    res[k++] = array[i][j];
    }
    if (–b < t) { break; } //从下到上 for (int i = b, j = l; i >= t; i–) {
    res[k++] = array[i][j];
    }
    l++;
    }
    return res;
    }
    }

    0 赞同 0 条回复
  • mpweixin用户 永久会员 2023年7月25日 上午1:24
    class Solution {
        public int[] spiralOrder(int[][] matrix) {
            if(matrix == null || matrix.length == 0 || matrix[0].length == 0){
                return new int[]{};
            }
    
            int[] result = new int[matrix.length * matrix[0].length];
            int left = 0,right = matrix[0].length - 1;
            int top = 0,bottom = matrix.length - 1;
    
            int index = 0;
            while(true){
                //从左到右
                for(int row = top,col = left; col <= right;col++){
                    result[index++] = matrix[row][col];
                }
                if(++top > bottom){
                    break;
                }
    
                //从上到下
                for(int row = top,col = right; row <= bottom;row++){
                    result[index++] = matrix[row][col];
                }      
                if(--right < left){
                    break;
                }
    
                //从右到左
                for(int row = bottom,col = right; col >= left;col--){
                    result[index++] = matrix[row][col];
                }
                if(--bottom < top){
                    break;
                }
    
                //从下到上
                for(int row = bottom,col = left;row >= top;row--){
                    result[index++] = matrix[row][col];
                }
                if(++left > right){
                    break;
                }
            }
    
            return result;
        }
    }
    
    0 赞同 0 条回复
  • Vow the vow。 普通 2023年7月24日 下午8:48

    模拟题

    public int[] spiralOrder(int[][] matrix) {
            if(matrix.length == 0) return new int[0];
            int l = 0, r = matrix[0].length - 1;
            int t = 0, b = matrix.length - 1;
            int 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 条回复
  • 张开怀 普通 2023年7月24日 下午8:30
    class Solution {
    public:
        vector<int> spiralOrder(vector<vector<int>>& matrix) {
            if (matrix.empty() || matrix[0].empty()) {
                return {};
            }
    
            int l = 0, r = matrix[0].size() - 1, t = 0, b = matrix.size() - 1;
            vector<int> res;
            while (true) {
                // 从左到右
                for (int j = l; j <= r; ++j) {
                    res.push_back(matrix[t][j]);
                }
                if (++t > b) {
                    break;
                }
    
                // 从上到下
                for (int i = t; i <= b; ++i) {
                    res.push_back(matrix[i][r]);
                }
                if (--r < l) {
                    break;
                }
    
                // 从右往左
                for (int j = r; j >= l; --j) {
                    res.push_back(matrix[b][j]);
                }
                if (--b < t) {
                    break;
                }
    
                // 从下往上
                for (int i = b; i >= t; --i) {
                    res.push_back(matrix[i][l]);
                }
                if (++l > r) {
                    break;
                }
            }
            return res;
        }
    };
    

    时间复杂度:O(mn)
    空间复杂度:O(1)

    0 赞同 0 条回复
  • yxy 普通 2023年7月24日 下午3:01

    时间:O(mn)
    空间:O(1)

    int dx[4]={0,1,0,-1};
    int dy[4]={1,0,-1,0};
    class Solution {
    public:
        vector<int> spiralOrder(vector<vector<int>>& matrix) {
            vector<int> res;
            int m=matrix.size();
            if(m==0) return res;
            int n=matrix[0].size();
            int x=0,y=0,count=1,k=0;
            res.push_back(matrix[0][0]);
            matrix[0][0]=INT_MAX;
            while(count<m*n)
            {
                int a=x+dx[k];
                int b=y+dy[k];
                if(a>=0&&a<m&&b>=0&&b<n&&matrix[a][b]!=INT_MAX)
                {
                    x=a;
                    y=b;
                    res.push_back(matrix[x][y]);
                    count++;
                    matrix[x][y]=INT_MAX;
                }
                else
                {
                    k++;
                    if(k==4) k=0;
                }
            }
            return res;
        }
    };
    
    0 赞同 0 条回复
  • 花老爷 普通 2023年7月23日 下午6:07

    模拟
    时间:O(mn)
    空间:O(1)

    class Solution {
        public int[] spiralOrder(int[][] matrix) {
            if (matrix.length == 0 || matrix[0].length == 0) {
                return new int[0];
            }
            int m = matrix.length, n = matrix[0].length;
            int[] ans = new int[m * n];
            int idx = 0, r = 0, c = 0, count = 0, dir = 0;
            boolean flag = true;
            while (idx < ans.length) {
                if (flag) {
                    ans[idx++] = matrix[r][c];
                }            
                if (dir == 0) {
                    if (c < n - count - 1) {
                        c++;
                        flag = true;
                    } else {
                        dir++;
                        flag = false;
                    }
                } else if (dir == 1) {
                    if (r < m - count - 1) {
                        r++;
                        flag = true;
                    } else {
                        dir++;
                        flag = false;
                    }
                } else if (dir == 2) {
                    if (c > count) {
                        c--;
                        flag = true;
                    } else {
                        dir++;
                        flag = false;
                    }
                } else if (dir == 3) {
                    if (r > count + 1) {
                        r--;
                        flag = true;
                    } else {
                        dir = 0;
                        count++;
                        flag = false;
                    }
                }
            }
            return ans;
        }
    }
    
    0 赞同 0 条回复
  • Ming 普通 2023年7月23日 下午5:25
    public int[] spiralOrder(int[][] matrix) {
            if(matrix == null || matrix.length == 0 || matrix[0].length == 0){
                return new int[0];
            }
            int l = 0, r = matrix[0].length - 1, t = 0, b = matrix.length - 1;
            int[] res = new int[(r+1) * (b+1)];
            int k = 0;
            while(true){
                // 从左到右
                for(int i = t,j = l; j <= r; j++){
                    res[k++] = matrix[i][j];
                }
                if(++t > b) break;
                // 从上到下
                for(int i = t, j = r; i <= b; i++){
                    res[k++] = matrix[i][j];
                }
                if(l > --r) break;
                // 从右往左
                for(int i = b, j = r; j >= l; j--){
                    res[k++] = matrix[i][j];
                }
                if(t > --b) break;
                // 从下往上
                for(int i = b, j = l; i >= t; i--){
                    res[k++] = matrix[i][j];
                }
                if(++l > r) break;
            }
            return res;
        }
    
    0 赞同 0 条回复
  • Yodl. 普通 2023年7月23日 下午4:20
    class Solution {
    public:
        vector<int> spiralOrder(vector<vector<int>>& matrix) {
            vector <int> res;
            if(matrix.empty()) return res;
            int rl = 0, rh = matrix.size()-1; //记录待打印的矩阵上下边缘
            int cl = 0, ch = matrix[0].size()-1; //记录待打印的矩阵左右边缘
            while(1){
                for(int i=cl; i<=ch; i++) res.push_back(matrix[rl][i]);//从左往右
                if(++rl > rh) break; //若超出边界,退出
                for(int i=rl; i<=rh; i++) res.push_back(matrix[i][ch]);//从上往下
                if(--ch < cl) break;
                for(int i=ch; i>=cl; i--) res.push_back(matrix[rh][i]);//从右往左
                if(--rh < rl) break;
                for(int i=rh; i>=rl; i--) res.push_back(matrix[i][cl]);//从下往上
                if(++cl > ch) break;
            }
            return res;
        }
    };
    
    0 赞同 0 条回复
  • 怀瑾 永久会员 2023年7月23日 下午4:00

    “`C++
    //使用顶行不大于底行,左列不大于右列控制循环
    /**
    * Note: The returned array must be malloced, assume caller calls free().
    */
    int* spiralOrder(int** matrix, int matrixSize, int* matrixColSize, int* returnSize){
    if (matrixSize == 0 || *matrixColSize == 0)
    {
    *returnSize = 0;
    return NULL;
    }

    int row = matrixSize;
    int col = *matrixColSize;
    int size = row*col;
    *returnSize = size;
    int* arr = (int*)malloc(sizeof(int) * size);
    int cnt = 0;//已经遍历的元素个数
    int left = 0, right = col - 1, up = 0, down = row - 1;//左右上下边界
    int i = 0;
    
    while (1)                           //cnt < size
    {
        for (i = left; cnt < size && i <= right; i++)
        {
            arr[cnt++] =  matrix[up][i];//打印上边界元素
        }
        //up++;
        if (++up > down)
            break;
        for (i = up; cnt < size && i <= down; i++)
        {
            arr[cnt++] = matrix[i][right];//打印右边界元素
        }
        //right--;
        if (--right < left)
            break;
        for (i = right; cnt < size && i >= left; i--)
        {
            arr[cnt++] = matrix[down][i];//打印下边界元素
        }
        //down--;
        if (--down < up)
            break;
        for (i = down; cnt < size && i >= up; i--)
        {
            arr[cnt++] = matrix[i][left];//打印左边界元素
        }
        //left++;
        if (++left > right)
            break;
    }
    return arr;
    

    }

    “`

    0 赞同 0 条回复

# 回答此问题

后才能回答