1. 程式人生 > 其它 >螺旋矩陣II-LeetCode59 考驗程式碼能力

螺旋矩陣II-LeetCode59 考驗程式碼能力

力扣連結: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;
    }
}

    怎麼樣,是不是簡單很多了捏!!!