每天一道算法题——顺时针打印矩阵

来源:互联网 发布:知了为什么是这个知 编辑:程序博客网 时间:2024/05/26 05:53

题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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.
测试用例:
[[1,2],[3,4],[5,6],[7,8],[9,10]]
对应输出应该为:
[1,2,4,6,8,10,9,7,5,3]

分析:

  1. 计算出层数,count为行列长度的最小值/2,为了避免奇偶性对结果的影响,采取(min/2-1)+1。(行为m,列为n)得到了层数,就开始第一次顺序打印。开始从左上到右上,将a[0][0]~a[0][n-1]分别add到List中。然后从右上到右下,将a[1][n-1]~a[m-1][n-1]add到List中。然后从右下到左下a[m-1][n-2]~a[m-1][1]。左下-左上…….根据规律即可慢慢推导出来4个for循环
    for (int i = 0; i < count; i++) {
    for(int j=i;j<n-i;j++){arrayList.add(matrix[i][j]);}
    for (int k = i+1; k < m-i; k++) {arrayList.add(matrix[k][n-i-1]);}
    for(int o=n-i-2;(o>=i)&(m-i-1!=i);o--){arrayList.add(matrix[m-i-1][o]);}
    for(int p=m-i-2;(p>i)&(n-i-1!=i);p--){arrayList.add(matrix[p][i]);}
    }

  2. 第二种方法摘自网友的解释,比较巧妙。
    源码等有空就补上:
    可以模拟魔方逆时针旋转的方法,一直做取出第一行的操作
    例如
    1 2 3
    4 5 6
    7 8 9
    输出并删除第一行后,再进行一次逆时针旋转,就变成:
    6 9
    5 8
    4 7
    继续重复上述操作即可。

源码:
1.

import java.util.ArrayList;public class Test1 {    public class Solution {        public ArrayList<Integer> printMatrix(int [][] matrix) {            ArrayList<Integer> arrayList = new ArrayList<Integer>();            if (matrix.length != 0) {                if (matrix[0].length!=0) {                    int m = matrix.length;                    int n = matrix[0].length;                                       int count = ((m<n?m:n)-1)/2+1;                    for (int i = 0; i < count; i++) {                        for(int j=i;j<n-i;j++){arrayList.add(matrix[i][j]);}                        for (int k = i+1; k < m-i; k++) {arrayList.add(matrix[k][n-i-1]);}                        for(int o=n-i-2;(o>=i)&(m-i-1!=i);o--){arrayList.add(matrix[m-i-1][o]);}                        for(int p=m-i-2;(p>i)&(n-i-1!=i);p--){arrayList.add(matrix[p][i]);}                    }                }                return arrayList;            }            return arrayList;        }    }}

2.

可以模拟魔方逆时针旋转的方法,一直做取出第一行的操作例如 1 2 34 5 67 8 9输出并删除第一行后,再进行一次逆时针旋转,就变成:6 95 84 7继续重复上述操作即可。

运行测试:

第一种:
运行时间:36ms
占用内存:8656k
第二种:

总结:
待续

原创粉丝点击