leetcode刷题记录——螺旋矩阵

leetcode刷题记录——螺旋矩阵

——参考代码随想录和力扣顺序刷题(https://programmercarl.com/)

本质:模拟题目图示过程


59. 螺旋矩阵 II(中等)

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

示例 1:

在这里插入图片描述

输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]

示例 2:

输入:n = 1
输出:[[1]]

思路:

  • 确定不变量:分四次循环;每次循环都是左闭右开(int j=l;j<r;j++)右边取小于号;
  • 用一个count来进行计数;
  • 注意n*n(n为奇数)的时候中间的需要额外补充(循环少一次)

代码:

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        int l=0,r=n-1,t=0,b=n-1;
        //统一左闭右开
        int count = 1;
        vector<vector<int>> matrix(n,vector<int>(n));
        for(int i=0;i<n/2;i++) {
            //从左到右
            for(int j=l;j<r;j++) {
                matrix[l][j] = count++;
            }
            //从上到下
            for(int k=t;k<b;k++) {
                matrix[k][r] = count++;
            }
            //从右到左
            for(int j=r;j>l;j--) {
                matrix[b][j] = count++;
            }
            //从下到上
            for(int k=b;k>t;k--) {
                matrix[k][l] = count++;
            }
            l = l + 1;
            t = t + 1;
            r = r - 1;
            b = b - 1;
        }
        if(n%2 != 0) {
            matrix[n/2][n/2] = n*n;
        }
        return matrix;
    }
};

54. 螺旋矩阵(中等)

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

在这里插入图片描述

示例1:

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]

思路:

  • 本质和59一样;进行题目模拟;
  • 但是会出现m和n不相等的情况,就会出现反复(多次)插入同一元素的情况;因此需要count计数;
  • if(count > m*n) break;
  • 最后再对n*n的进行单独处理;

代码:

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        int n = matrix.size();
        int m = matrix[0].size();
        vector<int> res;
        int l=0,r=m-1,t=0,b=n-1;
        //统一左闭右开
        int count = 1;
        for(int i=0;i<max(m,n)/2;i++) {
            //从左到右
            for(int j=l;j<r;j++) {
                if(count > m*n) break;
                res.push_back(matrix[l][j]);
                count++;
            }
            //从上到下
            for(int k=t;k<b;k++) {
                if(count > m*n) break;
                res.push_back(matrix[k][r]);
                count++;
            }
            //从右到左
            for(int j=r;j>l;j--) {
                if(count > m*n) break;
                res.push_back(matrix[b][j]);
                count++;
            }
            //从下到上
            for(int k=b;k>t;k--) {
                if(count > m*n) break;
                res.push_back(matrix[k][l]);
                count++;
            }
            l = l + 1;
            t = t + 1;
            r = r - 1;
            b = b - 1;
        }
        if(n%2 != 0 && m%2 != 0 && m == n) {
            res.push_back(matrix[n/2][n/2]);
        }
        return res;
    }
};

剑指 Offer 29. 顺时针打印矩阵(简单)

思路:

  • 和上题代码一样;

  • 多了空数组判断

    • if (matrix.size() == 0 || matrix[0].size() == 0) {
          return {};
      }
      


版权声明:本文为GZW18620285024原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。