首页 > 其他分享 >Leetcode 59. 螺旋矩阵 II && 剑指 Offer 29. 顺时针打印矩阵

Leetcode 59. 螺旋矩阵 II && 剑指 Offer 29. 顺时针打印矩阵

时间:2023-08-21 11:34:11浏览次数:33  
标签:59 matrix Offer int res 矩阵 ++ vector

这两个题非常相似,但是前者较为简单,后者较难。

由于前者访问的矩阵是方阵,因此可以通过迭代去做(因为方阵每次迭代,长和宽缩水的大小是一样的,但是矩阵不可以,因为矩阵最后一次迭代,长和宽的缩水不一定一样)

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> res(n, vector<int>(n, 0));
        func(res, 0, 0, n, 1);
        return res;
    }

    void func(vector<vector<int>> &res, int i, int j, int n, int v) {
        if(n == 0) return;
        if(n == 1) {
            res[i][j] = v;
        }

        else {
            for(int k = 0; k < n - 1;k ++ ) res[i][j++] = v++;
            for(int k = 0; k < n - 1;k ++ ) res[i++][j] = v++;
            for(int k = 0; k < n - 1; k ++ ) res[i][j--] = v++;
            for(int k = 0; k < n - 1; k ++ ) res[i--][j] = v++;
            func(res, i + 1, j + 1, n - 2, v);   
        }
    }

};

矩阵的操作更为复杂一些,除了要分别定义左右上下,而且每次循环访问一条边后都要判断边界条件。

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        if(matrix.size() == 0) return {};
        vector<int> res;
        int l = 0, r = matrix[0].size() - 1, b = matrix.size() - 1, t = 0;

        while(true) {
            for(int i = l; i <= r; i ++ ) res.emplace_back(matrix[t][i]);
            ++ t;
            if(t > b) break;
            for(int i = t; i <= b; i ++ ) res.emplace_back(matrix[i][r]);
            -- r;
            if(l > r) break;
            for(int i = r; i >= l; i -- ) res.emplace_back(matrix[b][i]);
            -- b;
            if(t > b) break;
            for(int i = b;i >= t; i -- ) res.emplace_back(matrix[i][l]);
            ++ l;
            if(l > r) break;
        }
        return res;
    }
};

 

标签:59,matrix,Offer,int,res,矩阵,++,vector
From: https://www.cnblogs.com/luxiayuai/p/17645573.html

相关文章

  • 【剑指Offer】10、矩形覆盖
    【剑指Offer】10、矩形覆盖题目描述:我们可以用2X1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2X1的小矩形无重叠地覆盖一个2Xn的大矩形,总共有多少种方法?解题思路:我们可以以2X8的矩形为例。先把2X8的覆盖方法记为f(8),用1X2的小矩形去覆盖时,有两种选择:横着放或......
  • 【剑指Offer】9、变态跳台阶
    【剑指Offer】9、变态跳台阶题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。解题思路:当只有一级台阶时,f(1)=1;当有两级台阶时,f(2)=f(2-1)+f(2-2);一般情况下,当有n级台阶时,f(n)=f(n-1)+f(n-2)+···+f(n-n)......
  • LeetCode -- 第 359 场周赛
    本题我们只需要将所有首字母取出来,并与s比较即可。classSolution{public:boolisAcronym(vector<string>&words,strings){stringres;for(auto&it:words){res+=it[0];}returnres==s;}};  ......
  • 剑指 Offer 68 - I. 二叉搜索树的最近公共祖先(简单)
    题目:classSolution{public:TreeNode*lowestCommonAncestor(TreeNode*root,TreeNode*p,TreeNode*q){//依旧要利用二叉搜索树的性质if(root->val>p->val&&root->val>q->val)returnlowestCommonAncestor(root->left,p,q);/......
  • 【剑指Offer】21、栈的压入、弹出序列
    【剑指Offer】21、栈的压入、弹出序列题目描述:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该......
  • 【剑指Offer】7、斐波那契数列
    【剑指Offer】7、斐波那契数列题目描述:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。假设n<=39。解题思路:斐波那契数列:0,1,1,2,3,5,8........总结起来就是:第一项是0,第二项是1,后续第n项为第n-1项和第n-2项之和。用公式描述如下:......
  • 旋转矩阵与欧拉角
    旋转矩阵与欧拉角参考文献:[ComputingEuleranglesfromarotationmatrix——GregoryG.Slabaugh]三个主轴的旋转矩阵右手坐标系,逆时针转动角度为正(右手螺旋定则确定)。关于绕\(x\)轴旋转\(\psi\)弧度的主动旋转定义为\[R_x(\psi)=\begin{bmatrix}......
  • 旋转矩阵
    目录旋转的表示旋转向量与旋转矩阵之间的变换旋转向量变成旋转矩阵旋转矩阵变为旋转向量左右手坐标系确定及其旋转正向旋转的表示在三维坐标系中,有三种表达形式旋转矩阵\[R=\begin{bmatrix}r_{11}&r_{12}&r_{13}\\r_{21}&r_{22}&r_{......
  • 《剑指Offer》-40-最小的 K 个数
    如果直接调用sortAPI然后要几个打印几个就没意思了,应该是和某个排序的内部过程结合首先排除O(N2)的低效率排序算法,最先想到的其实是堆排序,小根堆,但是需要额外的空间其次像快排、归并这样的也不合适……我想到了可以这样,快排第一轮划分之后,将部分舍去……应该就是这样了,堆排......
  • 剑指 Offer 55 - I. 二叉树的深度(简单)
    题目:classSolution{public:voidtraversal(TreeNode*cur,int&max,intdepth){//max用来记录最长路径长度,depth记录当前路径长度if(!cur)return;depth++;if(depth>max)max=depth;traversal(cur->left,max,depth);......