自己做的算法題目,分享自己的解題思路。
題目描述
給定一個整型矩陣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