牛客-剑指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.

二、解题思路

有点类似程序员面试金典中的像素旋转,也是通过分层的思想来解决,但是感觉这个题目更绕。

1     2       3      4       5

6      7      8      9       10

11    12    13    14      15

16     17     18    19      20

21      22     23    24     25

如上图中5*5的矩阵(当然矩阵的m和n不一定相等),首先计算行数m,列数n,以及可以划分的层数circle;外层循环 i 就是矩阵可以划分的层数,内层循环j是每行或者每列需要添加的元素的个数。然后选中某一层,该层的第一行的元素为第 i 行,列位置从 i 到n-i-1;该层的最后一列元素为第n-i-1列,行位置从i+1到m-1-i;该层的最后一行元素为第m-1-i行元素,列位置从n-2-i到i;该层的第一列元素为第i列元素,行位置从m-1-i到i+1。同时还需要判断第1行和最后一行是否重叠,如果重叠只添加一次;同理,判断第一列和最后一列是否重叠,如果重叠,也只添加一次。

三、代码

import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> printMatrix(int [][] matrix) {
       ArrayList<Integer> result=new ArrayList<Integer>();
        if(matrix==null)
           return result;
        int m=matrix.length;
        int n=matrix[0].length;
        int circle=Math.min(m+1,n+1)/2;
        for(int i=0;i<circle;i++){
            for(int j=i;j<=n-1-i;j++){//该行是第i行,最大长度是n-1-i
                result.add(matrix[i][j]);
            }
            for(int j=i+1;j<=m-1-i;j++){//该列是第n-1-i列,最大高度是m-1-i
                result.add(matrix[j][n-1-i]);
            }
            for(int j=i+1;j<=n-1-i && m-1-i!=i;j++){//该行是第m-1-i行,最大位置是n-i-2
                result.add(matrix[m-1-i][n-1-j]);
            }
            for(int j=i+1;j<m-1-i && n-1-i!=i;j++){//改列是第i列,最大的位置是
                result.add(matrix[m-1-j][i]);
            }
        }
        return result;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值