螺旋矩陣II-LeetCode59 考驗程式碼能力
阿新 • • 發佈:2022-11-29
力扣連結: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]]
剛開始拿到這個題目,我想大家跟我一樣,應該是很懵逼的狀態,我只知道要從左到右,從上到下,但是具體怎麼弄,我也不太會,屬實是一看就會,一寫就廢。
由外向內一圈一圈這麼畫下去。可以發現這裡的邊界條件非常多
那麼按照左閉右開的原則,來畫一圈,大家看一下(來自程式碼隨想錄):
這裡每一種顏色,代表一條邊,我們遍歷的長度,可以看出每一個拐角處的處理規則,拐角處讓給新的一條邊來繼續畫。這也是堅持了每條邊左閉右開的原則。一些同學做這道題目之所以一直寫不好,程式碼越寫越亂。就是因為在畫每一條邊的時候,一會左開右閉,一會左閉右閉,一會又來左閉右開,豈能不亂。
程式碼如下,細品:
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; } }
怎麼樣,是不是簡單很多了捏!!!