剑指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;
    }
}

  

原文地址:https://www.cnblogs.com/MrSaver/p/12161024.html