1. 程式人生 > >leetcode 59. 螺旋矩陣 II(Spiral Matrix II)

leetcode 59. 螺旋矩陣 II(Spiral Matrix II)

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

示例:

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

思路:

其實這題在具體的做法上,程式碼的簡潔性是可以優化的,不過我是直接把leetcode上的螺旋矩陣1的程式碼直接修改的,做法也是和第一個螺旋矩陣是差不多一樣的,不過執行的效率還是不錯的,beat96.70%,這裡還想說一下,其實boolean陣列是不需要開的,nums不等於0,就可以代替這個陣列有沒被訪問過這個功能了

class Solution {
	int k=1;
	boolean[][] is;

    public int[][] generateMatrix(int n) {
    	if(n<1)
    		return null;
    	
    	int[][] matrix = new int[n][n];
    	is = new boolean[n][n];
    	Right(matrix, 0, 0);
    	return matrix;
    }
    
    
    private void Right(int[][] matrix, int i, int j) {
        int m=matrix.length,n=matrix[0].length;

    	while(j<n && !is[i][j])
    	{
    		is[i][j] = true;
    		matrix[i][j++] = k++;
    	}
    	j--;
    	if(i+1<m && !is[i+1][j])
    		Down(matrix,i+1,j);
    }
    
    
	private void Down(int[][] matrix, int i, int j) {
        int m=matrix.length,n=matrix[0].length;

    	while(i<m && !is[i][j])
    	{
    		is[i][j] = true;
    		matrix[i++][j] = k++;
    	}
    	i--;
    	if(j-1>=0 && !is[i][j-1])
    		Left(matrix,i,j-1);		
	}

	private void Left(int[][] matrix, int i, int j) {
        int m=matrix.length,n=matrix[0].length;

    	while(j>=0 && !is[i][j])
    	{
    		is[i][j] = true;
    		matrix[i][j--] = k++;
    	}
    	j++;
    	if(i-1>=0 && !is[i-1][j])
    		Up(matrix,i-1,j);
	}
	
	private void Up(int[][] matrix, int i, int j) {
        int m=matrix.length,n=matrix[0].length;

    	while(i>=0 && !is[i][j])
    	{
    		is[i][j] = true;
    		matrix[i--][j] = k++;
    	}
    	i++;
    	if(j+1<n && !is[i][j+1])
    		Right(matrix,i,j+1);
	}
}