Skip to content
本页目录

0059-螺旋矩阵II

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]]

提示:

1 <= n <= 20

思路 : 暴力模拟法

根据题目思路,从1开始循环,分四个方向分别计算下一个坐标

参考代码

csharp
public class Solution {
    public int[][] GenerateMatrix(int n) {
    	//初始化数组
    	int[][] matrix = new int[n][];
    	for(int i=0; i<n; i++){
    		matrix[i] = new int[n];
    	}
    	//定义四个方向的边界
    	string direction = "right";
    	int col = 0;
    	int row = 0;
    	for(int i=1; i<=n*n; i++){

            //Console.WriteLine("row:{0},col:{1}",row,col);

    		matrix[row][col] = i;
    		//计算下一个坐标
    		if(direction == "right"){
    			if(col < n-1 && matrix[row][col+1] == 0){
    				col++;
    			}
    			else{
    				row++;
    				direction = "down";
    			}
    			continue;
    		}

    		if(direction == "down"){
    			if(row < n-1 && matrix[row+1][col] == 0){
    				row++;
    			}
    			else{
    				col--;
    				direction = "left";
    			}
    			continue;
    		}

    		if(direction == "left"){
    			if(col > 0 && matrix[row][col-1] == 0){
    				col--;
    			}
    			else{
    				row--;
    				direction = "up";
    			}
    			continue;
    		}

    		if(direction == "up"){
    			if(row > 0 && matrix[row-1][col] == 0){
    				row--;
    			}
    			else{
    				col++;
    				direction = "right";
    			}
    		}
    	}
        return matrix;
    }
}

思路2:按层模拟【官方】

csharp
public class Solution {
    public int[][] GenerateMatrix(int n) {
    	//初始化数组
    	int[][] matrix = new int[n][];
    	for(int i=0; i<n; i++){
    		matrix[i] = new int[n];
    	}

    	int left = 0;
    	int right = n-1;
    	int top = 0;
    	int bottom = n-1;
    	int num = 1;

    	while(left <= right && top <= bottom ){
    		//填充第一行
    		for(int i=left; i<=right; i++){
    			matrix[top][i] = num;
    			num++;
    		}
    		//填充右边一列
    		for(int i=top+1; i<=bottom; i++){
    			matrix[i][right] = num;
    			num++;
    		}            
            //填充底部一列
            for(int i=right-1; i>=left; i--){
                matrix[bottom][i] = num;
                num++;
            }
            //填充左侧一列
            for(int i=bottom-1; i>=top+1; i--){
                matrix[i][left] = num;
                num++;
            }   		
    		//收缩范围
    		left++;
    		right--;
    		top++;
    		bottom--;
    	}
    	return matrix;
    }
}

思路3,按层计算优化

https://leetcode.cn/problems/spiral-matrix-ii/solution/spiral-matrix-ii-mo-ni-fa-she-ding-bian-jie-qing-x/ 处理完直接收缩边界,这样不用再用代码精确控制边界+1,-1

csharp
public class Solution {
    public int[][] GenerateMatrix(int n) {
    	//初始化数组
    	int[][] matrix = new int[n][];
    	for(int i=0; i<n; i++){
    		matrix[i] = new int[n];
    	}

    	int left = 0;
    	int right = n-1;
    	int top = 0;
    	int bottom = n-1;
    	int num = 1;

    	while(num <= n*n){
    		//填充第一行
    		for(int i=left; i<=right; i++){
    			matrix[top][i] = num;
    			num++;
    		}
    		top++;

    		//填充右边一列
    		for(int i=top; i<=bottom; i++){
    			matrix[i][right] = num;
    			num++;
    		}
    		right--;

            //填充底部一列
            for(int i=right; i>=left; i--){
                matrix[bottom][i] = num;
                num++;
            }
            bottom--;

            //填充左侧一列
            for(int i=bottom; i>=top; i--){
                matrix[i][left] = num;
                num++;
            }   		
            left++;
    	}
    	return matrix;
    }
}

Released under the MIT License.