您好,登錄后才能下訂單哦!
本文實例為大家分享了java實現順時針打印矩陣的具體代碼,供大家參考,具體內容如下
題目:
輸入一個矩陣,按照從外向里以順時針的順序依次打印出每一個數字,例如,如果輸入如下矩陣: 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.
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
方法一:
介紹一種矩陣處理方式:矩陣分圈處理。在矩陣中用左上角的坐標(tR,tC)和右下角的坐標(dR,dC)可以表示一個子矩陣,如題目中矩陣,當(tR,tC)=(0,0)、(dR,dC)=(3,3)時,表示的子矩陣就是整個矩陣,那么這個子矩陣的最外層的部分為:
1 2 3 4
5 8
9 12
13 14 15 16
把這個子矩陣的最外層順時針打印出來,那么在(tR,tC)=(0,0)、(dR,dC)=(3,3)時,打印的結果為:1,2,3,4,8,12,16,15,14,13,9,5。接下來,分別使tR和tC加1,dR和dC減1,即(tR,tC)=(1,1)、(dR,dC)=(2,2)時,此時的子矩陣為:
6 7
10 11
再把這個矩陣順時針打印出來,結果為6,7,11,10。再把tR和tC加1,dR和dC減1,即(tR,tC)=(2,2)、(dR,dC)=(1,1)。如果左上角坐標位于右下角坐標的右方或者下方(即tR>dR ||tC>dC),則停止,已經打印的所有結果即為要求的打印結果。
package Array; import java.util.ArrayList; import java.util.List; public class spiralOrder { /** * @param matrix: a matrix of m x n elements * @return: an integer list */ //轉圈打印矩陣 //左上角點(tR,tC),右下角(dR,dC) public List<Integer> spiralOrder(int[][] matrix) { // write your code here List<Integer> list=new ArrayList<>(); if(matrix==null||matrix.length==0) return list; int dR=matrix.length-1; int dC=matrix[0].length-1; int tR=0; int tC=0; while(tR<=dR && tC<=dC ){ PrintMatrix(matrix,list,tR++,tC++,dR--,dC--); } return list; } private void PrintMatrix(int[][] matrix,List<Integer> list,int tR,int tC,int dR,int dC){ if(tR==dR){ // 子矩陣只有一行 for(int i=tC;i<=dC;i++) list.add(matrix[tR][i]); }else if(tC==dC){ // 子矩陣只有一列 for(int i=tR;i<=dR;i++) list.add(matrix[i][tC]); }else{ int curC=tC; int curR=tR; while(curC!=dC){ list.add(matrix[tR][curC]); curC++; } while(curR!=dR){ list.add(matrix[curR][dC]); curR++; } while (curC!=tC){ list.add(matrix[dR][curC]); curC--; } while(curR!=tR){ list.add(matrix[curR][tC]); curR--; } } } public static void main(String[] args) { spiralOrder spiralOrder=new spiralOrder(); int[][] matrix={}; System.out.println(spiralOrder.spiralOrder(matrix)); } }
方法二:
分析:如果以矩陣左上角為(0,0),則每一圈開始的點是(0,0)、(1,1)...,可以觀察如果2*2矩陣,只打印1圈,3*3矩陣,打印2圈,3*2矩陣,打印1圈,所以有col>count*2 && row>count*2,count從0開始。
對于每一圈的打印,開始的行號和列號都為count,結束的行號endrow=row-1-count,結束的列號endcol=col-1-count。
第一步從左向右打印是必須的,循環打印,行號為count,列號為count到endrow遞增。
第二步從上往下打印滿足的條件是終止行號大于開始行號endrow>count,循環打印,行號為count+1到endrow遞增,列號為endcol。
第三步從右往左打印滿足的條件是第二步條件終止行號大于開始行號endrow>count并且終止列號大于開始列號endcol>count,循環打印,行號為endrow,列號為endcol-1到count遞減。
第四步從下往上打印滿足的條件是終止列號大于開始列號endcol>start且終止行號至少比開始行號大2即endrow-count>1,循環打印,行號為endrow-1到count+1遞減,列號為count。
import java.util.ArrayList; public class Solution { public ArrayList<Integer> result=new ArrayList<>(); public ArrayList<Integer> printMatrix(int [][] matrix) { int row=matrix.length; int col=matrix[0].length; if(matrix==null || row<0 || col<0){ return null; } int count=0; while(col>count*2 && row>count*2){ PrintCircle(matrix,col,row,count); count++; } return result; } public void PrintCircle(int [][] matrix,int col,int row,int start){ int endrow=row-start-1; int endcol=col-start-1; //從左到右打印一行 //第一行一定會打印的 for(int i=start;i<=endcol;i++){ result.add(matrix[start][i]); } //從上往下打印(第二步) if(endrow>start){ for(int i=start+1;i<=endrow;i++){ result.add(matrix[i][endcol]); } } //從右往左打印(第三步) if(endrow>start && endcol>start){ for(int i=endcol-1;i>=start;i--){ result.add(matrix[endrow][i]); } } //從下往上打印(第四步) if((endrow-start>1)&&endcol>start){ for(int i=endrow-1;i>=start+1;i--){ result.add(matrix[i][start]); } } } }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。