【剑指offer】顺时针打印矩阵

    xiaoxiao2025-06-17  8

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

    思路:  1.确认是否为只有一行或一列的特殊情况  2.顺时针将圈一个个剥离,一个圈即一个矩形,如下图,橙色为第一圈,蓝色为第二圈  3.由图可知,第一圈的范围(蓝色),由[ startRow ][ startCol ] (即[0][0])到[ endRow ][ endCol ]确定 先向右走,从startcol ~ endCol,即第一行 再向下走,因为第一个元素4已记录过,所以从startRow+1开始走, 到 endRow结束,即最后一列 再向左走,因为第一个元素2已记录过,所以从endCol-1开始走,到startCol结束,即最后一行 再向上走,因为第一个元素5已记录过,最后一个元素1也已记录过,所以从endRow-1到startRow+1 至此一圈结束

     4.由图可以看出下一圈的范围由[ startRow+1 ][ startCol+1 ] (即[1][1])到[ endRow-1 ][ endCol-1 ]确定,重复上述过程直到startRow > endRow 或 startCol > endCol

    实现: *通过简单循坏即可完成,注意去掉重复元素就行

    import java.util.ArrayList; public class Solution { public ArrayList<Integer> printMatrix(int [][] matrix) { int row = matrix.length; if(row==0) return null; int col = matrix[0].length; if(col==0) return null; ArrayList<Integer> list = new ArrayList<Integer>(); //新建动态数组存储结果 int startRow = 0; int endRow = row-1; int startCol = 0; int endCol = col-1; while(startRow<=endRow&&startCol<=endCol){ if(startRow==endRow){ //只有一行 for(int i=startCol;i<=endCol;i++) list.add(matrix[startRow][i]); return list; } if(startCol==endCol){ //只有一列 for(int i=startRow;i<=endRow;i++) list.add(matrix[i][startCol]); return list; } for(int i=startCol;i<=endCol;i++) //向右 list.add(matrix[startRow][i]); for(int i=startRow+1;i<=endRow;i++) //向下,注意去掉第一个元素 list.add(matrix[i][endCol]); for(int i=endCol-1;i>=startCol;i--) //向左,注意去掉第一个元素 list.add(matrix[endRow][i]); for(int i=endRow-1;i>=startRow+1;i--) //向下,注意去掉第一个和最后一个元素 list.add(matrix[i][startCol]); startRow = startRow + 1; //确定下一圈的范围 startCol = startCol + 1; endRow = endRow - 1; endCol = endCol - 1; } return list; } }
    最新回复(0)