剑指offer系列之18:顺时针打印矩阵

题目描述:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。

思路:这道题在算法上没有难度,关键在于设计一种逻辑容易理解,代码易于实现的转圈遍历方式,矩阵分圈处理能够解决很多其它的面试题。在矩阵中用左上角的坐标(tR,tC)和右下角的坐标(dR,dC)就可以表示一个子矩阵,可以把打印一圈分为四步,第一部从左到右打印一行,第二步从上向下打印一列,第三步从右到左打印一行,第四部从下向上打印一列,不过要注意最后一圈可能是只有一行,只有一列或只有一个数字,这些要在代码中考虑到。

import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> printMatrix(int [][] matrix) {
        if(matrix == null || matrix.length == 0){
            return null;
        }
        ArrayList<Integer> result = new ArrayList<Integer>();
        printMatrixClock(matrix, 0, 0, matrix.length - 1, matrix[0].length - 1, result);
        return result;
    }

    public void printMatrixClock(int[][] matrix,int startRow,int startCol,int endRow,
                                int endCol,ArrayList<Integer> result){
        if(startRow<endRow && startCol<endCol){
            for(int j = startCol;j<=endCol;j++){
                result.add(matrix[startRow][j]);
            }
            for(int i = startRow+1;i<=endRow-1;i++){
                result.add(matrix[i][endCol]);
            }
            for(int j = endCol;j>=startCol;j--){
                result.add(matrix[endRow][j]);
            }
            for(int i=endRow-1; i>=startRow+1; i--) { 
                result.add(matrix[i][startCol]);
            }
            printMatrixClock(matrix, startRow + 1, startCol + 1, endRow - 1, endCol - 1, result) ;
        }else if(startRow==endRow && startCol<endCol) {
            for(int j=startCol; j<=endCol; j++) { 
                result.add(matrix[startRow][j]);
            }
        }else if(startRow<endRow && startCol==endCol) {
            for(int i=startRow; i<=endRow; i++) { 
                result.add(matrix[i][endCol]);
            }
        }else if(startRow==endRow && startCol==endCol) {
            result.add(matrix[startRow][startCol]) ;
        }else {
            return ;
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值