NC38-螺旋矩阵

博客围绕矩阵螺旋顺序输出元素的题目展开。给定m x n矩阵,需按螺旋顺序返回所有元素。题解先考虑方阵情况,定义边界值和遍历方向,还指出特殊情况,如矩阵为空或特定矩阵样式,需加条件限定,否则结果有误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、题目

给定一个m x n大小的矩阵(m行,n列),按螺旋的顺序返回矩阵中的所有元素。

示例1

输入

[[1,2,3],[4,5,6],[7,8,9]]

返回值

[1,2,3,6,9,8,7,4,5]

二、题解

先考虑矩阵为方阵的情况(m==n),定义边界值:left,right,top,bottom,遍历方向(从左向右、从上向下、从右向左、从下向上)

然后考虑特殊情况,如矩阵为空,矩阵为以下两种case,需要加条件限定,否则输出结果不对

case1:

1  2    3     4

5  6    7     8

9  10  11  12

case2:

1    2    3

5    6    7

9   10  11 

13 14  15

17 18  19

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int> > &matrix) {
        vector<int> res;
        int m = matrix.size();
        int n = matrix[0].size();
        if(m==0 || n==0) return res;//数组为空
        
        int left = 0,right = n-1;
        int top = 0,btm = m-1;
        while(left<=right && top<=btm){
            //从左往右遍历
            for(int i=left;i<=right;i++){
                res.push_back(matrix[top][i]);
            }
            //从上往下遍历
            for(int j=top+1;j<=btm;j++){
                res.push_back(matrix[j][right]);
            }
            //从右往左遍历
            if(top < btm){//case:[[1,2,3,4],[5,6,7,8],[9,10,11,12]],不加if判断时输出[1,2,3,4,8,12,11,10,9,5,6,7,6],因为满足for的条件,执行循环体后,结果中多了个6
                for(int k=right-1;k>=left;k--){
                    res.push_back(matrix[btm][k]);
                }
            }
            //从下往上遍历
            if(left < right){//case:[[1,2,3],[5,6,7],[9,10,11],[13,14,15],[17,18,19]],不加if判断时输出[1,2,3,7,11,15,19,18,17,13,9,5,6,10,14,10,14],因为满足for的条件,多输出10,14
                for(int m=btm-1;m>top;m--){
                    res.push_back(matrix[m][left]);
                }
            }
            
            top++;
            btm--;
            left++;
            right--;
        }
        return res;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值