[代码随想录]数组--螺旋矩阵

螺旋矩阵II

文章目录

      • 螺旋矩阵II
      • 例题如下
        • 59.螺旋矩阵II
        • 54.螺旋矩阵
        • 剑指 Offer 29. 顺时针打印矩阵

  • 按照自己思路来就ok,逻辑理清楚就行

例题如下

59.螺旋矩阵II

给你一个正整数 n ,生成一个包含 1n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix

[代码随想录]数组--螺旋矩阵_第1张图片

1.自己搞了一遍

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> result(n, vector<int>(n, 0));
        int num = 1;
        for(int i = 0;i < n;i++){
            for(int j = i;j < n - i;j++){//上侧,从左到右,左闭右闭
                if(result[i][j] == 0) result[i][j] = num++;
                else break;
            }
            for(int k = i + 1;k < n - i;k++){//右侧,从上到下,上开下闭
                if(result[k][n - 1 - i] == 0) result[k][n - 1 - i] = num++;
                else break;
            }
            for(int l = n - i - 2;l >= i;l--){//下侧,从右到左,右开左闭
                if(result[n - i - 1][l] == 0) result[n - i - 1][l] = num++;
                else break;
            }
            for(int m = n - i - 2; m > i; m--){//左侧,从下到上,下开上开
                if(result[m][i] == 0) result[m][i] = num++;
                else break;
            }
        }
        return result;
    }
};

2.改一下,看的舒服一些,但是运行速度变长了,储存空间也变大了

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> result(n, vector<int>(n, 0));
        int num = 1;
        for(int i = 0;i < n;i++){
            for(int j = i;j < n - i - 1;j++){//上侧,从左到右,左闭右开
                if(result[i][j] == 0) result[i][j] = num++;
                else break;
            }
            for(int k = i;k < n - i - 1;k++){//右侧,从上到下,上闭下开
                if(result[k][n - i - 1] == 0) result[k][n - i - 1] = num++;
                else break;
            }
            for(int l = n - i - 1;l > i;l--){//下侧,从右到左,右闭左开
                if(result[n - i - 1][l] == 0) result[n - i - 1][l] = num++;
                else break;
            }
            for(int m = n - i - 1; m > i ; m--){//左侧,从下到上,下闭上开
                if(result[m][i] == 0) result[m][i] = num++;
                else break;
            }
        }
        if(result[n / 2][n / 2] == 0) result[n / 2][n / 2] = num++;
        return result;
    }
};

3.看到一个非常优雅的代码,leetcode一个评论中

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        int t = 0;      // top
        int b = n-1;    // bottom
        int l = 0;      // left
        int r = n-1;    // right
        vector<vector<int>> ans(n,vector<int>(n));
        int k=1;
        while(k<=n*n){
            for(int i=l;i<=r;++i,++k) ans[t][i] = k;
            ++t;
            for(int i=t;i<=b;++i,++k) ans[i][r] = k;
            --r;
            for(int i=r;i>=l;--i,++k) ans[b][i] = k;
            --b;
            for(int i=b;i>=t;--i,++k) ans[i][l] = k;
            ++l;
        }
        return ans;
    }
};
54.螺旋矩阵

给你一个 mn 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

[代码随想录]数组--螺旋矩阵_第2张图片

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        int num = 0;
        int m = matrix.size();
        int n = matrix[0].size();
        vector<int> result(m * n);
        for(int i = 0;i < m; i++){
            for(int j = i;j < n - i;j++){
                if(num == m * n)break;
                else result[num++] = matrix[i][j];
            }
            for(int k = i + 1;k < m - i;k++){
                if(num == m * n)break;
                result[num++] = matrix[k][n - i - 1];
            }
            for(int l = n - i - 2;l >= i;l--){
                if(num == m * n)break;
                result[num++] = matrix[m - i - 1][l];
            }
            for(int z = m - i - 2;z > i;z--){
                if(num == m * n)break;
                result[num++] = matrix[z][i];
            }
        }
        return result;
    }
};
剑指 Offer 29. 顺时针打印矩阵

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。

跟54题一样,但是多了可能会出现空数组

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        if (matrix.size() == 0 || matrix[0].size() == 0) return {};//多了个空数组判定
        int num = 0;
        int m = matrix.size();
        int n = matrix[0].size();
        vector<int> result(m * n);
        for(int i = 0;i < m; i++){
            for(int j = i;j < n - i;j++){
                if(num == m * n)break;
                else result[num++] = matrix[i][j];
            }
            for(int k = i + 1;k < m - i;k++){
                if(num == m * n)break;
                result[num++] = matrix[k][n - i - 1];
            }
            for(int l = n - i - 2;l >= i;l--){
                if(num == m * n)break;
                result[num++] = matrix[m - i - 1][l];
            }
            for(int z = m - i - 2;z > i;z--){
                if(num == m * n)break;
                result[num++] = matrix[z][i];
            }
        }
        return result;
    }
};

你可能感兴趣的:(C++,刷题,算法,leetcode,c++)