1. 程式人生 > >LeetCode:螺旋矩陣||【59】

LeetCode:螺旋矩陣||【59】

LeetCode:螺旋矩陣||【59】

題目描述 

給定一個正整數 n,生成一個包含 1 到 n2 所有元素,且元素按順時針順序螺旋排列的正方形矩陣。

示例:

輸入: 3
輸出:
[
 [ 1, 2, 3 ],
 [ 8, 9, 4 ],
 [ 7, 6, 5 ]
]

題目分析

  這道題難度也是中等,是那道噁心題的衍生版,但是說實話難度小於1,且已經明示一定是正方形矩。我們直接改一下1的程式碼就可以了!並且效率是非常高的!

  

  這道題簡直也喪心病狂☺!我們採用的方式是一圈一圈賦值

  答案將是從第一個外層按順時針順序填寫所有元素,然後是第二個外層的元素,依此類推

  我們首先定義四個元素,r1,r2,c1,c2,這將框定一個範圍,我們順時針賦值這個範圍邊上的值,每次賦值以後再次縮小框

  好的問題來了?

  1.要賦值幾個框?

    times=Math.min(長,寬)%2==0?Math.min(長,寬)/2:Math.min(長,寬)/2+1;

  2.順時針賦值的橫縱座標變化規律?如圖所示有顏色是要賦值的框

  

Java題解

public class SpiralMatrixII_59 {
    public int[][] generateMatrix(int n) {
        int[][] arr = new int[n][n];
        int c1  =  0;
        int c2  = n-1;
        int r1  = 0;
        int r2 = n-1;
        int count =1 ;
        int times = Math.min(n,n)%2==0?Math.min(n,n)/2:Math.min(n,n)/2+1;
        for(int i=0;i<times;i++)
        {
            for (int c = c1; c <= c2; c++) arr[r1][c]=count++;
            for (int r = r1 + 1; r <= r2; r++) arr[r][c2]=count++;
            if (r1 < r2 && c1 < c2) {
                for (int c = c2 - 1; c > c1; c--) arr[r2][c]=count++;
                for (int r = r2; r > r1; r--) arr[r][c1]=count++;
            }
            r1++;
            r2--;
            c1++;
            c2--;
        }
        return arr;
    }
}