一天一道LeetCode系列

(一)题目

Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.

For example,

Given the following matrix:

[

[ 1, 2, 3 ],

[ 4, 5, 6 ],

[ 7, 8, 9 ]

]

You should return [1,2,3,6,9,8,7,4,5].

(二)解题

相当于顺时针打印矩阵。我想到的方法就是一圈一圈的打印,每一圈的起点分别是(0,0),(1,1)…..,那么退出循环打印的条件是什么呢?

我们可以分析3*3的矩阵有两圈,4*4的矩阵有两圈,5*5的矩阵有三圈,6*6的矩阵有三圈…..

假设m*n的矩阵,起点位置为(ori,ori),那么满足的条件为m>ori*2&&n>ori*2

具体思路见代码注释:

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        vector<int> ret;
        if(matrix.size() ==0) return ret;//矩阵为空的时候直接返回
        int ori=0;//每一圈的起点
        int row = matrix.size();
        int col = matrix[0].size();
        int px=ori,py=ori;
        int i , j , x, y;
        while(row>ori*2 && col > ori*2)//退出循环的条件
        {
                bool flag1 = false, flag2 = false, flag3 = false;//整圈打印需要连续,如果发生某一个方向没打印就下面的就不需要判断了
            for (i = px; i < col - px; i++)//从左往右
            {
                ret.push_back(matrix[py][i]);
                flag1 = true;
            }
            px = i-1;//i越界了,应该减1
            for (j = py+1; j < row - py && flag1; j++)//从上到下
            {
                ret.push_back(matrix[j][px]);
                flag2 = true;
            }
            py = j-1;//同上
            for (x = px-1; x >= ori&&flag2; x--)//从右往左
            {
                ret.push_back(matrix[py][x]);
                flag3 = true;
            }
            px = x+1;//同上
            for (y = py-1; y > ori &&flag3; y--)//从下到上
            {
                ret.push_back(matrix[y][px]);
            }
            px = ++ori;//更新起点x
            py = ori;//更新起点y
        }
        return ret;
    }
};

最新文章

  1. JDK各个版本的新特性jdk1.5-jdk8
  2. WebService未能加载文件或程序集&ldquo;ESRI.ArcGIS.XXX&rdquo;或它的某一个依赖项
  3. Android Studio常用快捷键
  4. winsow xp不能安装软件, 提示&quot;中断&quot; 是因为设置了 软件限制策略
  5. js this的使用举例
  6. tomcat+spring+https
  7. Asp.Net--上传大文件(页面超时)
  8. DataTable转换为LIST
  9. 【hadoop】14、hadoop2.5的mapreduce的 配置
  10. Eclipse用法和技巧十四:自动生成的TODO注释2
  11. Android学习笔记(三)Android开发环境的搭建
  12. GridControl 设置自带选中复选框及设置该列列头名称
  13. css3动画知识点
  14. 《Language Implementation Patterns》之 构建语法树
  15. http请求requestUtils
  16. CSAPP之阅读笔记-计算机系统漫游(1)
  17. 如何生成Junit报告
  18. 将常用的T-CODE收藏进 文件夹
  19. 纯css实现打字效果
  20. OpenCV 图形变换

热门文章

  1. Linux服务器搭建相关教程链接整理
  2. docker环境 快速使用elasticsearch-head插件
  3. Spring声明式事务总结
  4. JVM三种垃圾收集算法思想及发展过程
  5. 20160217.CCPP体系详解(0027天)
  6. Linux下创建软链接
  7. JavaMail API 概述
  8. 打开Voice Over时,CATextLayer的string对象兼容NSString和NSAttributedString导致的Crash(二解决思路3)
  9. Sqoop-1.4.5用户手册
  10. java创建对象详解和多态问题