1. 程式人生 > >[劍指offer]順時針打印矩陣

[劍指offer]順時針打印矩陣

只有一個 打印 特殊情況 start brush tin 例如 sta new

調了兩三小時,從通過11%的案例,到60%,再到80%,再到100%

輸入一個矩陣,按照從外向裏以順時針的順序依次打印出每一個數字,
例如,如果輸入如下4 X 4矩陣: 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.

  

我的思路就是把矩陣看成一圈一圈的,而順時針打印就是從最外圈到最裏圈一圈一圈遍歷

同時一個圈由四個變量決定:行開始的地方,行結束的地方,列開始的地方和列結束的地方

所以只需控制好這四個變量,註意邊界,問題就不難了

同時,需要考慮的特殊情況就是一行的矩陣和一列的矩陣,還有最裏圈的只有一行,和只有一個數字的情況

這些都考慮到問題就解決了

import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> printMatrix(int [][] matrix) {
        int rowEnd = matrix.length-1;//行
        int columnEnd = matrix[0].length-1;//列
        int columnStart = 0;
        int rowStart = 0;
        ArrayList<Integer> res = new ArrayList<>();
        //特殊情況,只有一行
        if (matrix.length==1){
            for (int i = 0;i < matrix[0].length;i++){
                res.add(matrix[0][i]);
            }
            return res;
        }
        //特殊情況,只有一列
        if (matrix[0].length==1){
            for (int i = 0;i < matrix.length;i++){
                res.add(matrix[i][0]);
            }
            return res;
        }
        //把矩形看做一圈一圈的,一圈一圈打印,控制好邊界
        while (true){
            if (columnEnd<columnStart||rowStart>rowEnd){
                break;
            }
            res.addAll(printIn(matrix,rowStart,rowEnd,columnStart,columnEnd));
            rowStart+=1;
            columnStart+=1;
            rowEnd-=1;
            columnEnd-=1;
        }
        return res;
    }
    //全部常量均為下標,即從0開始
    public ArrayList<Integer> printIn(int[][] matrix,int rowStart,int rowEnd,int columnStart,int columnEnd){
        ArrayList<Integer> list = new ArrayList<>();
        int i = 0;
        if (columnEnd==columnStart){
            //列開始和列結束重合,即最裏圈只剩一個數
            list.add(matrix[rowEnd][columnEnd]);
            return list;
        }
        if (rowEnd==rowStart){
            //行開始和行結束重合,最裏圈只有一行,將此行加入list
            for (i = columnStart;i <= columnEnd;i++){
                list.add(matrix[rowStart][i]);
            }
            return list;
        }
        //四個for循環遍歷一圈
        for (i = columnStart;i <= columnEnd;i++){
            list.add(matrix[rowStart][i]);
        }
        for (i = rowStart+1;i < rowEnd;i++){
            list.add(matrix[i][columnEnd]);
        }
        for (i = columnEnd;i>=columnStart;i--){
            list.add(matrix[rowEnd][i]);
        }
        for (i = rowEnd-1;i>=rowStart+1;i--){
            list.add(matrix[i][rowStart]);
        }
        return list;
    }
}

  

[劍指offer]順時針打印矩陣