LeetCode Spiral Matrix
2015-06-28 12:18
417 查看
Description:
Given a matrix of m x n elements
(m rows, n columns),
return all elements of the matrix in spiral order.
Solution:
这道题目基本就是模拟
先说一个最基本的定义,layer表示一共进行了几圈螺旋的旋转数。可以很明显的得知,前面layer-1次的螺旋都是完整旋转。
这一部分没什么好说的,找出能够进行“完整”转圈的环,都是从(i,i) -> (i, n-1-i) -> (m-1-i, n-1-i) -> (i, i+1),其中i的取值是从0到layer-1。
下面比较容易绕的是最内层的循环,但还是先给出交给定义:
m_remain表示是完整的旋转圈数转完之后,还有几行没有进行旋转;n_remain类似,表示的还有几列没有旋转。这里有一个明显的性质,就是m_remain和n_remain至少有一个是小于等于1的,否则二者都大于等于2,则可以形成一个完整的旋转。
下面是“非完整”的旋转情况
m_remain==1 || n_remain==1
总结一下:这类对二维数组的处理,难点就是边界值的取值,+1和-1之类的会很复杂,需要仔细想想。
Given a matrix of m x n elements
(m rows, n columns),
return all elements of the matrix in spiral order.
Solution:
这道题目基本就是模拟
先说一个最基本的定义,layer表示一共进行了几圈螺旋的旋转数。可以很明显的得知,前面layer-1次的螺旋都是完整旋转。
这一部分没什么好说的,找出能够进行“完整”转圈的环,都是从(i,i) -> (i, n-1-i) -> (m-1-i, n-1-i) -> (i, i+1),其中i的取值是从0到layer-1。
下面比较容易绕的是最内层的循环,但还是先给出交给定义:
m_remain表示是完整的旋转圈数转完之后,还有几行没有进行旋转;n_remain类似,表示的还有几列没有旋转。这里有一个明显的性质,就是m_remain和n_remain至少有一个是小于等于1的,否则二者都大于等于2,则可以形成一个完整的旋转。
下面是“非完整”的旋转情况
m_remain==1 || n_remain==1
总结一下:这类对二维数组的处理,难点就是边界值的取值,+1和-1之类的会很复杂,需要仔细想想。
import java.util.*; public class Solution { int m, n, m_remain, n_remain; ArrayList<Integer> list; public List<Integer> spiralOrder(int[][] matrix) { list = new ArrayList<Integer>(); m = matrix.length; if (m == 0) return list; n = matrix[0].length; int layer = Math.min((m + 1) / 2, (n + 1) / 2); m_remain = m - 2 * (layer - 1); n_remain = n - 2 * (layer - 1); for (int i = 0; i < layer - 1; i++) read(i, matrix); if (m_remain == 1) { for (int i = layer - 1; i < n - (layer - 1); i++) list.add(matrix[layer - 1][i]); } else if (n_remain == 1) { for (int j = layer - 1; j < m - (layer - 1); j++) list.add(matrix[j][layer - 1]); } else { read(layer - 1, matrix); } return list; } void read(int i, int[][] matrix) { int a = i, b = i; for (; b < n - 1 - i; b++) list.add(matrix[a][b]); for (; a < m - 1 - i; a++) list.add(matrix[a][b]); for (; b > i; b--) list.add(matrix[a][b]); for (; a > i; a--) list.add(matrix[a][b]); } }
相关文章推荐
- tortoiseSVN svn+ssh
- 想搭建自己的网站,应该从哪处入手呢?选择什么样配置的服务器捏?通过哪些手段赚取足够的维护网
- Unity 脚本优化
- 分析用Python脚本关闭文件操作的机制
- GCC系列: Homebrew安装GCC和binutils
- Double-Checked Locking is Fixed In C++11
- Mysql的limit用法
- nodejs学习过程的问题
- 关于搜狐新浪ip库查询接口的使用
- 关于 android 环信无法正确获取昵称的问题
- windows与OSX双操的时区-黑苹果之路
- LinkedList浅析
- 倾斜摄影技术发展与应用前景
- android 数据库查询方法
- Iocomp控件IPlot在VS2010中使用方法(区别VC6.0)
- ICTCLAS用的字Lucene4.9捆绑
- python实现linux下使用xcopy的方法
- 在iOS 中创建自定义Delegates properties with ARC错误的解决方法
- 联想教育应用说明(7.6版本号)——文章3章 日常维护和使用联想教育应用
- 网站上线半个月怎么样做到日访问100IP的