天天看點

轉圈列印矩陣解題思路分析代碼實作:解題思路

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

題目描述

給定一個整型矩陣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

繼續閱讀