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

题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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 3
4 5 6
7 8 9
输出并删除第一行后,再进行一次逆时针旋转,就变成:
6 9
5 8
4 7
继续重复上述操作即可。

运行测试:

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

总结:
待续

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值