• 剑指Offer_19_顺时针打印矩阵


    题目描述

    输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵:
    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.

    解题思路

    每次打印一圈。每次的起始位置满足(start,start),且 start * 2 要小于行数和列数。
    每次打印从矩形的上边开始(在存在一圈的情况下),顺时针打印。
    首先打印上边,打印完成,判断结束行是否大于start,如果大于,那么打印右边;然后判断结束列是否大于start且结束行是否大于start,如果满足,则打印下边;最后如果存在多列且行数至少有三行,则打印左边。

    实现

    import java.util.ArrayList;
    public class Solution {
        public ArrayList<Integer> printMatrix(int [][] matrix) {
            ArrayList<Integer> list = new ArrayList<>();
            if (matrix == null || matrix.length <= 0 || matrix[0].length <= 0) return list;
            int start = 0;
            int rows = matrix.length;
            int cols = matrix[0].length;
            while (rows > start * 2 && cols > start * 2){
                print(matrix,cols,rows,start,list);
                start ++;
            }
            return list;
        }
    
        private void print(int[][] matrix, int cols, int rows, int start, ArrayList<Integer> list) {
            int endRows = rows - start - 1;
            int endCols = cols - start - 1;
            //打印上边
            for (int i = start; i < cols - start; i++){
                list.add(matrix[start][i]);
            }
            //存在多行,打印右边
            if (endRows > start){
                int j = endCols;
                for (int i = start + 1; i < rows - start; i ++){
                    list.add(matrix[i][j]);
                }
            }
    
            //存在多行且有多列,打印下边
            if (endRows > start && endCols > start){
                int rIndex = endRows;
                for (int i = cols - start - 2; i >= start; i--){
                    list.add(matrix[rIndex][i]);
                }
            }
    
            //存在三行以上且有多列,打印下边
            if (endRows > start + 1 && endCols > start){
                for (int i = rows - start - 2; i > start; i--){
                    list.add(matrix[i][start]);
                }
            }
        }
    }
    
  • 相关阅读:
    bzoj1878: [SDOI2009]HH的项链
    bzoj1053: [HAOI2007]反素数ant
    bzoj2456: mode
    bzoj2330: [SCOI2011]糖果
    bzoj1050: [HAOI2006]旅行comf
    bzoj1047: [HAOI2007]理想的正方形
    bzoj1968: [Ahoi2005]COMMON 约数研究
    bzoj1046: [HAOI2007]上升序列
    bzoj2440: [中山市选2011]完全平方数
    bzoj1202: [HNOI2005]狡猾的商人
  • 原文地址:https://www.cnblogs.com/ggmfengyangdi/p/5773775.html
Copyright © 2020-2023  润新知