顺时钟打印矩阵

1:题目描述

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。

 

示例 1:

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
示例 2:

输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shun-shi-zhen-da-yin-ju-zhen-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2:题目分析

  很显然这是一个二维数据的搜索问题,搜索顺序按照题目要求顺时钟搜索,所以本体的关键是如何如何根据当前位置和已经搜索的位置判断下次搜索的方向问题:算法思路如下:

  1. 建立标记矩阵
  2. 根据当前位置和标记矩阵来判断下次行动位置。
  3. 迭代执行本方法直到所有位置都被标记。

3:代码示例

class Solution {
    int[][] markMatrix = null;
    int[][] matrix = null;
    int length = 0;
    int kuan = 0;
    int[] resultArray;
    int index = 0;

    public int[] spiralOrder(int[][] matrix) {
        this.matrix = matrix;
        this.length = matrix.length;
        if(length == 0)
            return new int[0];
        this.kuan = matrix[0].length;
        this.markMatrix = new int[length][kuan];
        resultArray = new int[length*kuan];
        //如果是1维数组,直接输出。
        if(matrix.length==0||matrix[0].length==0)
            return matrix[0];
        if(matrix.length==1) {
            //取出二维数组第一行数据。
            return matrix[0];
        }
        if(matrix[0].length==1) {
            //取出二维数组第一列所有数据。
            for(int i=0;i<matrix.length;i++)
                resultArray[i] = matrix[i][0];
            return  resultArray;
        }

        move(0,0);


        return resultArray;
    }

    //用来顺时钟递归遍历当前二维矩阵,
    public void move(int i,int j) {
        markMatrix[i][j] = 1;//在markMatrix中做标记处理
        int curNumber = matrix[i][j];
        resultArray[index++] = curNumber;
        int direction = findDirection(i,j);

        //向右
        if(direction==1)
            move(i,j+1);
        //向下
        if(direction==2)
            move(i+1,j);
        //向左
        if(direction==3)
            move(i,j-1);
        //向上
        if(direction==4)
            move(i-1,j);

        if(direction==0)
            return ;
    }

    //根据辅助矩阵和当前位置来判断下次遍历方向。
    public int findDirection(int i,int j) {
        //1:右
        //2:下
        //3:左
        //4:上
        //0:代表结束遍历,无位置可走!!

        //如果当前位置上下左右不能走,则直接return 0。
        if((    (i-1<0)||markMatrix[i-1][j]==1)
                && ((i+1>length-1)||markMatrix[i+1][j]==1)
                && ((j-1<0)||markMatrix[i][j-1]==1)
                && ((j+1>length-1)||markMatrix[i][j+1]==1)){
            return 0;
        }

        //如果当前位置左和上不能走,则向右。
        if(((j-1<0)||markMatrix[i][j-1]==1) && ((i-1<0)||markMatrix[i-1][j]==1)){
            //进行拐角判断,如果右边也不能走,则应该向下
            if((j+1>kuan-1)||markMatrix[i][j+1]==1)
                return 2;
            return 1;
        }
        //如果当前位置右和上不能走,则向下。
        if(((j+1>kuan-1)||markMatrix[i][j+1]==1) && ((i-1<0)||markMatrix[i-1][j]==1)){
            //拐角判断,如果下面也不能走了,应该向右走
            if(((i+1>length-1)||markMatrix[i+1][j]==1))
                return 3;
            return 2;
        }
        //如果当前位置右和下不能走,则向左。
        if(((j+1>kuan-1)||markMatrix[i][j+1]==1) && ((i+1>length-1)||markMatrix[i+1][j]==1)){
            //拐角判定,如果左也不能走了,则向上
            if((j-1<0)||markMatrix[i][j-1]==1)
                return 4;
            return 3;
        }
        //如果当前位置左和下不能走,则向上。
        if((j-1<0)||markMatrix[i][j-1]==1 && ((i+1>length-1)||markMatrix[i+1][j]==1)){
            //如果上面也不能走了,到了拐点,则右走
            if((i-1<0)||markMatrix[i-1][j]==1)
                return 1;
            return 4;
        }

        return 0;
    }

}

 

 

posted @ 2020-03-17 21:34  大朱123  阅读(144)  评论(0编辑  收藏  举报