[算法]旋转矩阵问题(Spiral Matrix)
2016-01-29 21:03
323 查看
题目一:
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].
解答:
采用从最外层一层一层向内操作的方法。public class Solution { public List<Integer> spiralOrder(int[][] matrix) { List<Integer> res = new ArrayList<>(); if(matrix==null||matrix.length==0||matrix[0].length==0) return res; //每一圈左上角数字的坐标为(top,left),右下角的数字的坐标为(bottom,right) int top = 0, left = 0; int bottom = matrix.length - 1, right = matrix[0].length - 1; while (top <= bottom && left <= right) { outEdge(res, matrix, left++, top++, right--, bottom--); } return res; } private static void outEdge(List<Integer> res, int[][] matrix, int left, int top, int right, int bottom) { if (top == bottom) { for (int i = left; i <= right; i++) { res.add(matrix[top][i]); } } else if (left == right) { for (int i = top; i <= bottom; i++) { res.add(matrix[i][left]); } } else { int curRow = top; int curCol = left; while (curCol < right) { res.add(matrix[top][curCol++]); } while (curRow < bottom) { res.add(matrix[curRow++][right]); } while (curCol > left) { res.add(matrix[bottom][curCol--]); } while (curRow > top) { res.add(matrix[curRow--][left]); } } } }
题目二:
Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order.For example,
Given n =
3,
You should return the following matrix:
[ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]
public static int[][] generateMatrix(int n) { int[][] res = new int ; int top = 0, left = 0; int bottom = n - 1, right = n - 1; int num = 1; while (left<=right&&top<=bottom) { num= inputEdge(num, res, left++, top++, right--, bottom--); } return res; } private static int inputEdge(int num, int[][] res, int left, int top, int right, int bottom) { int curRow = top; int curCol = left; if (top==bottom&&left==right){ res[top][left]=num; return num; } while (curCol < right) { res[top][curCol++] = num++; } while (curRow < bottom) { res[curRow++][right] = num++; } while (curCol > left) { res[bottom][curCol--] = num++; } while (curRow > top) { res[curRow--][left] = num++; } return num; }
相关文章推荐
- solr5.3.1 集群服务搭建(转)
- css实现屏幕自适应(仿谷歌静态页面)
- PagerHelper-分页类
- pcl 1.6 + vs2013 + openmesh 3.3 配置
- cout<<"a1="<<a<<endl; cout<<"a2="<<-0x80000000<<endl;
- HashMap的实现原理
- 动态规划问题
- HDU2612 find a way
- Ubuntu静态网络配置
- 教研室 ftp 文件服务器使用教程
- iOS开发流程
- About memories in ASIC FPGA
- 前端工具--spritepad
- Android中实现静态的默认安装和卸载应用
- Asp.net Mvc Action重定向总结
- 20145327寒假第一周学习总结
- 前端笔记
- LEETCODE--Odd Even Linked List
- 机械学习-深度学习(ReinforcementLernen)
- Cocos2dx3.4 VS2013无法打开包括文件extensions/ExtensionExport.h解决的方法