zoukankan      html  css  js  c++  java
  • LeetCode 54. 螺旋矩阵(Spiral Matrix) 剑指offer-顺时针打印矩阵

    题目描述

    给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。

    示例 1:

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

    示例 2:

    输入:
    [
      [1, 2, 3, 4],
      [5, 6, 7, 8],
      [9,10,11,12]
    ]
    输出: [1,2,3,4,8,12,11,10,9,5,6,7]
    

    解题思路

    首先判断要打印的矩阵外圈左上角元素坐标是否满足条件。通过观察可得,左上角元素的横坐标和纵坐标的两倍应分别小于总行数和总列数,即row*2<rows且col*2<cols。然后判断打印边界情况,可以得到最右边的列索引为cols-col-1,同理最下边的行索引为rows-row-1,考虑按以下顺序打印并检查:

    • 从左上角元素开始,打印第一行到最右列;
    • 从第二行最右列元素开始,打印最后一列到最下行;
    • 若最下边的行索引不与第一行重合,则从最下行的倒数第二列元素开始,打印元素到第一列;
    • 若最左边的行索引不与最右边重合,则从第一列的倒数第二行元素开始,打印到第二行停止

    代码

     1 class Solution {
     2 public:
     3     vector<int> spiralOrder(vector<vector<int>>& matrix) {
     4         vector<int> v;
     5         if(matrix.empty())
     6             return v;
     7         int rows=matrix.size(),cols=matrix[0].size();
     8         int row=0,col=0;
     9         while(row*2<rows&&col*2<cols){
    10             int rl=rows-row-1,cl=cols-col-1;
    11             for(int i=col;i<=cl;i++)
    12                 v.push_back(matrix[row][i]);
    13             for(int i=row+1;i<=rl;i++)
    14                 v.push_back(matrix[i][cl]);
    15             if(rl!=row){
    16                 for(int i=cl-1;i>=col;i--)
    17                     v.push_back(matrix[rl][i]);
    18             }
    19             if(cl!=col){
    20                 for(int i=rl-1;i>row;i--)
    21                     v.push_back(matrix[i][col]);
    22             }
    23             row++;col++;
    24         }
    25         return v;
    26     }
    27 };
  • 相关阅读:
    python核心编程第五章练习-5.17-随机序列
    python核心编程第五章练习-5.11-最大公约数和最小公倍数
    微信机器人之PC微信hook
    PC微信获取登录二维码
    PC微信读取微信好友列表(联系人)
    验证码识别之二值化
    基于决策树的简单验证码识别
    基于朴素贝叶斯识别简单验证码
    PIL库的简单操作
    knn识别简单验证码
  • 原文地址:https://www.cnblogs.com/wmx24/p/8999288.html
Copyright © 2011-2022 走看看