转圈打印矩阵解题思路分析

自己做的算法题目,分享自己的解题思路。

题目描述

给定一个整型矩阵matrix,请按照顺时针转圈的方式打印它。

如下示例1

输入
[[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.*;


public class Solution {
    /**
     * 
     * @param matrix int整型二维数组 the matrix
     * @return int整型一维数组
     */
    public int[] printMatrix (int[][] matrix) {
        // write code here
        int len1 = matrix.length;
        int len2 = matrix[0].length;
        int[] result = new int[len1*len2];
        int status =1;  //设定状态 1:向前  2:向下  3:向后  4:向上;初始状态是从左往右向前读取
        int i=0,j=0;
        int top=0,right=len2-1,bottle=len1-1,left=0;
        int m=0;
        while(m<result.length){
              switch(status){
                case 1:{
                    i=top;
                    for(j=left;j<=right;j++){
                        result[m] = matrix[i][j];
                        m++;
                    }
                    top++;
                    status = 2;
                    break;
                }
                case 2:{
                    j = right;
                    for(i=top;i<=bottle;i++){
                        result[m] = matrix[i][j];
                        m++;
                    }
                    right--;
                    status=3;
                    break;
                }
                case 3:{
                    i=bottle;
                    for(j=right;j>=left;j--){
                        result[m] = matrix[i][j];
                        m++;
                    }
                    bottle--;
                    status = 4;
                    break;
                }
                case 4:{
                    j=left;
                    for(i=bottle;i>=top;i--){
                        result[m] = matrix[i][j];
                        m++;
                    }
                    left++;
                    status = 1;
                    break;
                }
                default:break;
            }
        }

        return result;
        
    }
}

解题思路

转圈打印整形矩形数组,返回成一个一维数组,可以分析总共有四种都取矩形数组的方式:向前(右)读取、向下读取、向后(左)读取、向上读取;注意已经读取的点不能再次读取(要特别注意各个拐弯的节点).

再每一次读取完一行后要排除一行,读取完一列之后要排除一列。

所以如上述代码:

      向前(右)读取完一行,行号(i)不变,列号(j)依序增加,读取完一行最后一个值后,将这上面一行排除(top++)并将状态(status)更改为向下读取;

      向下读取完一列,行号(i)依序增加,列号(j)不变,读取完一列最后一个值后,将这右边一列排除(right--)并将状态(status)更改为向后(左)读取;

      向后(左)读取完一行,行号(i)不变,列号(j)依序递减,读取完一行最后一个值后,将这最下面一行排除(bottle--)并将状态(status)更改为向上读取;

      向上读取完一列,行号(i)依序递减,列号(j)不变,读取完一列最后一个值后,将这左边一列排除(left++)并将状态(status)更改为向前(右)读取;

循环执行上述操作,知道读取完全部值。

如上述例图:  操作行为为:向前----》向下----》向后----》向上---》向前----》向下----》向后;

第一次(向前):1,2,3,4

第二次(向下):1,2,3,4,8,12,16

第三次(向后):1,2,3,4,8,12,16,15,14,13

第四次(向上):1,2,3,4,8,12,16,15,14,13,9,5

第五次 (向前):1,2,3,4,8,12,16,15,14,13,9,5,6,7

第六次(向下):1,2,3,4,8,12,16,15,14,13,9,5,6,7,11

第七次(向后):1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10

猜你喜欢

转载自blog.csdn.net/qq_22596931/article/details/109768501
今日推荐