LeetCode -- SpiralOrder
2015-09-01 13:29
246 查看
题目描述:
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].
从例子可以看出,需要做的是从矩阵的第一个元素为起始,沿外环向内依次遍历,最后打印出结果。
思路:
获取矩阵的长宽,设需要走n圈,则n = Min(宽度,高度)/2。
从左上节点为起始开始遍历,走到最右的最后一个元素开始向下走,走到最后向左走,最后向上走。走了一圈,需要把坐标往内+1。
需要考虑刚好处于矩阵中间线的情况。
实现代码:
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].
从例子可以看出,需要做的是从矩阵的第一个元素为起始,沿外环向内依次遍历,最后打印出结果。
思路:
获取矩阵的长宽,设需要走n圈,则n = Min(宽度,高度)/2。
从左上节点为起始开始遍历,走到最右的最后一个元素开始向下走,走到最后向左走,最后向上走。走了一圈,需要把坐标往内+1。
需要考虑刚好处于矩阵中间线的情况。
实现代码:
public class Solution { public IList<int> SpiralOrder(int[,] matrix) { if(matrix == null){ return new List<int>(); } var result = new List<int>(); var rowLen = matrix.GetLength(0); var len = matrix.GetLength(1); if(rowLen == 1){ for(var i =0 ;i < len; i++){ result.Add(matrix[0,i]); } return result; } if(len == 1){ for(var i =0 ;i < rowLen; i++){ result.Add(matrix[i,0]); } return result; } var minLen = Math.Min(rowLen,len); var cycleCount = minLen % 2 == 0 ? minLen/2 : (minLen + 1) / 2; var c = 0; for(var i = 0;i < cycleCount; i++){ if(c == len-c-1){ for(var k = c;k < rowLen - c; k++){ result.Add(matrix[k, c]); } c++; continue; } // stick row to top, column : [c,len-c-1] for(var top = c; top < len-c - 1; top++){ result.Add(matrix[c,top]); } // stick column to right, row : [c,rowLen-c-1] for(var right = c; right < rowLen-c - 1; right ++){ result.Add(matrix[right, len-c-1]); } // stick row to bottom, column : [len-c-1, c] for(var down = len-c -1; down > c; down --){ result.Add(matrix[rowLen-c-1, down]); } // stick column to left, row : [len-c-1, c] for(var left = rowLen-c - 1; left > c; left --){ result.Add(matrix[left, c]); } c++; } return result; } }
相关文章推荐
- Linux 基金会创建开放对象存储规格
- Linux 基金会创建开放对象存储规格
- Linux 基金会创建开放对象存储规格
- HDU 1064.Financial Management【超级无敌大水题】【9月1】
- 传输数据超长时,服务器未响应
- LeetCode 4 Median of Two Sorted Arrays 查找中位数,排除法,问题拓展 难度:1
- 【LeetCode】Sort Colors
- Celery 实现分布式任务队列
- linux下用java实现ftp上传、下载文件
- 浅谈机器学习的职业发展方向
- Java引用类型(强引用、弱引用、软引用、幽灵引用)
- Failed resolution of: Lcom/lion/ccpay/R$style;
- android子线程中弹出Toast
- [科普文] 网络流量劫持危害有多大?继续解密黑客巧妙神奇的“离线”入侵手段 (二)
- linux中fork()函数详解
- 常用的C语言编程工具
- 0-1背包
- 应用部署到JBOSS上遇到的问题
- Java常用的设计模式03:常用设计模式之单例模式(创建型模式)
- 黑马程序员之集合框架2