(《剑指Offer》笔记)顺时针打印矩阵
2014-09-15 16:24
134 查看
联系螺旋矩阵那一道题。解题思路都是先画图,然后发现螺旋相当于一圈一圈的打印,每一圈的起点都是(i,i)。
public class PrintMatrixInCircle { //每一圈的起点都是(i,i) //对于一个m*n的矩阵,最后一圈的起点坐标为min((m-1)/2,(n-1)/2),这是最后一个start的位置。因此m-1>=2*start,n-1>=2*start //所以当row>startX*2&&column>startY*2时循环 public static void printMatrixClockWisely(int[][]numbers){ if(numbers==null) return; int rows=numbers.length; int columns=numbers[0].length; int start=0; while(rows>start*2&&columns>start*2){ PrintMatrixInCircle(numbers,start); start++; } } /**m*n矩阵,第i圈四个顶点分别是(i.i) (i,n-i-1) (m-i-1,i) (m-i-1,n-i-1)坐标系横轴为row,纵轴为column * @param numbers 数组 * @param start 每一圈开始的位置 */ private static void PrintMatrixInCircle(int[][] numbers, int start) { int rows=numbers.length; int columns=numbers[0].length; int endR=rows-start-1; int endC=columns-start-1; //从左到右打印一行 for(int i=start;i<=endC;i++){ System.out.println(numbers[start][i]); } //从上到下打印一列,说明至少两行 if(start<endR){ for(int i=start+1;i<=endR;i++){ System.out.println(numbers[i][endC]); } } //从右到左打印一行,说明至少两行两列 if(start<endR&&start<endC){ for(int i=endC-1;i>=start;i--){ System.out.println(numbers[endR][i]); } } //从下到上打印一列,说明至少三行两列 if(start<endR-1&&start<endC){ for(int i=endR-1;i>=start+1;i--){ System.out.println(numbers[i][start]); } } } public static void main(String[] args) { int[][]numbers=new int[][]{{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}}; printMatrixClockWisely(numbers); } }
相关文章推荐
- 《剑指Offer》学习笔记--面试题20:顺时针打印矩阵
- 剑指offer 面试题20:顺时针打印矩阵
- (剑指Offer)面试题20:顺时针打印矩阵
- 【剑指offer系列】 顺时针打印矩阵___20
- 剑指Offer:面试题20——顺时针打印矩阵(java实现)
- 剑指offer(21):顺时针打印矩阵
- 《剑指offer》面试题20 顺时针打印矩阵
- leetcode-54 Spiral Matrix 顺时针打印矩阵(《剑指offer》面试题20)
- 剑指offer系列之18:顺时针打印矩阵
- 《剑指offer》——顺时针打印矩阵
- 剑指offer(16)-顺时针打印矩阵
- 剑指offer--顺时针打印矩阵
- 《剑指offer》——顺时针打印矩阵
- 《剑指offer》顺时针打印矩阵
- 剑指OFFER——顺时针打印矩阵
- 《剑指offer》学习之--顺时针打印矩阵
- 《剑指offer》面试题:顺时针打印矩阵
- JAVA实现顺时针打印矩阵问题(《剑指offer》)
- 《剑指offer》-顺时针打印矩阵
- 剑指offer(十六)之顺时针打印矩阵