剑指Offer:顺时针打印矩阵
剑指Offer:顺时针打印矩阵
题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.
题目分析
这道题简直丧心病狂☺!我们采用的方式是一圈一圈打印!
答案将是从第一个外层按顺时针顺序排列的所有元素,然后是第二个外层的元素,依此类推。
我们首先定义四个元素,r1,r2,c1,c2,这将框定一个范围,我们顺时针打印这个范围边上的值,每次打印以后再次缩小框。
好的问题来了?
1.要打印几个框?
times=Math.min(长,宽)%2==0?Math.min(长,宽)/2:Math.min(长,宽)/2+1;
2.顺时针打印的横纵坐标变化规律?如图所示有颜色是要打印的框
3、吐槽一下这个题,简直恶心。
Java题解
class Solution { public List<Integer> spiralOrder(int[][] matrix) { List<Integer> ans = new ArrayList<>(); int m = matrix.length; //行 if (m == 0) return ans; int n = matrix[0].length;//列 int c1 = 0; int c2 = n-1; int r1 = 0; int r2 = m-1; int times = Math.min(m,n)%2==0?Math.min(m,n)/2:Math.min(m,n)/2+1; for(int i=0;i<times;i++) { for (int c = c1; c <= c2; c++) ans.add(matrix[r1][c]); for (int r = r1 + 1; r <= r2; r++) ans.add(matrix[r][c2]); if (r1 < r2 && c1 < c2) { for (int c = c2 - 1; c > c1; c--) ans.add(matrix[r2][c]); for (int r = r2; r > r1; r--) ans.add(matrix[r][c1]); } r1++; r2--; c1++; c2--; } return ans; } }