剑指offer-顺时针打印矩阵

题目:顺时针打印矩阵

题目描述:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.

思路:这个题不难,但是比较繁琐,先来看看我的思路

我是先确定4个角的点

mStart:行开始的点,mEnd,行结束的点

nStart:列开始的点,nEnd:列结束的点

如这个矩阵

------>
1 2 3
4 5 6 7 8 9 2 5 7

我是按上面这样的顺序转的

代码:代码看上去比较多但是有不少是重复的,很好理解

 1 import java.util.ArrayList;
 2 public class Solution {
 3     public ArrayList<Integer> printMatrix(int [][] matrix) {
 4         ArrayList<Integer>list=new ArrayList<>();
 5         int m=matrix.length;
 6         int n=matrix[0].length;
 7         int mStart=0;int mEnd=m-1;
 8         int nStart=0;int nEnd=n-1;
 9           if(mStart==mEnd&&nStart==nEnd){
          //说明矩阵只有一个元素
10 list.add(matrix[mStart][nStart]); 11 } 12 if(mStart==mEnd&&nStart<nEnd){
          //说明此时矩阵为一列
13 for(int i=nStart;i<=nEnd;i++) 14 list.add(matrix[mStart][i]); 15 } 16 if(nStart==nEnd&&mStart<mEnd){
          //说明此时为一行
17 for(int i=mStart;i<=mEnd;i++) 18 list.add(matrix[i][nStart]); 19 } 20 21 while(mStart<mEnd&&nStart<nEnd){
        //按我上图颜色区域去遍历
22 for(int i=nStart;i<nEnd;i++){ 23 list.add(matrix[mStart][i]); 24 } 25 for(int i=mStart;i<mEnd;i++){ 26 list.add(matrix[i][nEnd]); 27 } 28 for(int i=nEnd;i>nStart;i--){ 29 list.add(matrix[mEnd][i]); 30 } 31 for(int i=mEnd;i>mStart;i--){ 32 list.add(matrix[i][nStart]); 33 } 34 //将行,列开始,结束位置都减1 35 mStart++; 36 mEnd--; 37 nStart++; 38 nEnd--; 39 if(mStart==mEnd&&nStart==nEnd){ 40 list.add(matrix[mStart][nStart]); 41 } 42 if(mStart==mEnd&&nStart<nEnd){ 43 for(int i=nStart;i<=nEnd;i++) 44 list.add(matrix[mStart][i]); 45 } 46 if(nStart==nEnd&&mStart<mEnd){ 47 for(int i=mStart;i<=mEnd;i++) 48 list.add(matrix[i][nStart]); 49 } 50 51 } 52 return list; 53 } 54 }

学习一下按照圈数来控制循环次数的解法;

 1  
 2 import java.util.ArrayList;
 3 public class Solution {
 4     public ArrayList<Integer> printMatrix(int [][] array) {
 5         ArrayList<Integer> result = new ArrayList<Integer> ();
 6         if(array.length==0) return result;
 7         int n = array.length,m = array[0].length;
 8         if(m==0) return result;
 9         int layers = (Math.min(n,m)-1)/2+1;//这个是层数
10         for(int i=0;i<layers;i++){
11             for(int k = i;k<m-i;k++) result.add(array[i][k]);//左至右
12             for(int j=i+1;j<n-i;j++) result.add(array[j][m-i-1]);//右上至右下
13             for(int k=m-i-2;(k>=i)&&(n-i-1!=i);k--) result.add(array[n-i-1][k]);//右至左
14             for(int j=n-i-2;(j>i)&&(m-i-1!=i);j--) result.add(array[j][i]);//左下至左上
15         }
16         return result;       
17     }
18 }
原文地址:https://www.cnblogs.com/pathjh/p/9144813.html