力扣鏈接:https://leetcode.cn/problems/spiral-matrix-ii/
題目
給你一個正整數 n ,生成一個包含 1 到 n2 所有元素,且元素按順時針順序螺旋排列的 n x n 正方形矩陣 matrix ,
示例1:

輸入:n = 3 輸出:[[1,2,3],[8,9,4],[7,6,5]]
示例2:
輸入:n = 1 輸出:[[1]]
剛開始拿到這個題目,我想大家跟我一樣,應該是很懵逼的狀態,我只知道要從左到右,從上到下,但是具體怎么弄,我也不太會,屬實是一看就會,一寫就廢,
由外向內一圈一圈這么畫下去,可以發現這里的邊界條件非常多,在一個回圈中,如此多的邊界條件,如果不按照固定規則來遍歷,那就是一進回圈深似海,從此offer是路人,這里一圈下來,我們要畫每四條邊,這四條邊怎么畫,每畫一條邊都要堅持一致的左閉右開,或者左開右閉的原則,這樣這一圈才能按照統一的規則畫下來,
那么按照左閉右開的原則,來畫一圈,大家看一下(來自代碼隨想錄):

這里每一種顏色,代表一條邊,我們遍歷的長度,可以看出每一個拐角處的處理規則,拐角處讓給新的一條邊來繼續畫,這也是堅持了每條邊左閉右開的原則,一些同學做這道題目之所以一直寫不好,代碼越寫越亂,就是因為在畫每一條邊的時候,一會左開右閉,一會左閉右閉,一會又來左閉右開,豈能不亂,
代碼如下,細品:
class Solution { public int[][] generateMatrix(int n) { int loop = 0; // 控制回圈次數 int[][] res = new int[n][n]; int start = 0; // 每次回圈的開始點(start, start) int count = 1; // 定義填充數字 int i, j; while (loop++ < n / 2) { // 判斷邊界后,loop從1開始 // 模擬上側從左到右 for (j = start; j < n - loop; j++) { res[start][j] = count++; } // 模擬右側從上到下 for (i = start; i < n - loop; i++) { res[i][j] = count++; } // 模擬下側從右到左 for (; j >= loop; j--) { res[i][j] = count++; } // 模擬左側從下到上 for (; i >= loop; i--) { res[i][j] = count++; } start++; } if (n % 2 == 1) { res[start][start] = count; } return res; } }
首先當然得先定義一個陣列,然后定義一個開始點start已經一個控制回圈次數變數,很顯然我們回圈次數不超過n/2,然后開始模擬,先從左到右,遵循左閉右開原則,給res[start][j]賦值,回圈到n-loop停止,然后從上往下,給res[i][j]賦值,此次回圈的是行,接下來兩個同理,和前面兩步相反的方向進行即可,注意終止的條件是>=loop,最后start++(要準備下次回圈開始的位置了),最后還得判斷矩陣是否是奇數大小,如果是奇數,最中間的值得填充,
這是代碼隨想錄的解法,個人覺得比較難理解,看到了另外一種方法,更簡單容易理解,代碼如下:
class Solution { public int[][] generateMatrix(int n) { int[][] qq=new int[n][n]; int count=2; qq[0][0]=1; int i=0,j=0; while(count<=n*n){ while(j<n-1 && qq[i][j+1]==0) qq[i][++j]=count++; //右 while(i<n-1 && qq[i+1][j]==0) qq[++i][j]=count++; //下 while(j>0 && qq[i][j-1]==0) qq[i][--j]=count++; //左 while(i>0 && qq[i-1][j]==0) qq[--i][j]=count++; //上 } return qq; } }
怎么樣,是不是簡單很多了捏!!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/538721.html
標籤:其他
上一篇:HCIE Routing&Switching之MPLS靜態LSP配置
下一篇:KVC原理與資料篩選
