首页 > 试题广场 >

螺旋矩阵-ii

[编程题]螺旋矩阵-ii
  • 热度指数:10800 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
给定一个整数n,将数字1到按螺旋的顺序填入n×n的矩阵
例如:
给出的n=3,
你应该返回如下矩阵:
[
 [ 1, 2, 3 ],
 [ 8, 9, 4 ],
 [ 7, 6, 5 ]
]
示例1

输入

2

输出

[[1,2],[4,3]]
public int[][] generateMatrix(int n) {
		int[][] res = new int[n][n];
		if (n < 1)
			return res;
		int index = 1, rowStart = 0, rowEnd = n - 1, colStart = 0, colEnd = n - 1;
		while (index <= n * n) {
			for (int i = colStart; i <= colEnd; i++) {
				res[rowStart][i] = index++;
			}
			for (int i = rowStart + 1; i <= rowEnd; i++) {
				res[i][colEnd] = index++;
			}
			for (int i = colEnd - 1; i >= colStart; i--) {
				res[rowEnd][i] = index++;
			}
			for (int i = rowEnd - 1; i > rowStart; i--) {
				res[i][colStart] = index++;
			}

			rowStart += 1;
			rowEnd -= 1;
			colStart += 1;
			colEnd -= 1;

		}

		return res;
	}

发表于 2017-06-27 10:56:47 回复(2)
class Solution {
public:
    vector<vector<int> > generateMatrix(int n) {
        vector<vector<int> > matrix(n,vector<int>(n));
        int count = 1;
		int row_start = 0,row_end = n-1,col_start = 0,col_end = n-1;
        
        while(count <= n*n)
        {
	 		for(int i=col_start;i<=col_end;i++)
	        	matrix[row_start][i] = count++;
	        row_start++;
	        
	        for(int i=row_start;i<=row_end;i++)
	        	matrix[i][col_end] = count++;
	        col_end--;
	        
	        for(int i=col_end;i>=col_start;i--)
	        	matrix[row_end][i] = count++;
	        row_end--;
	        
	        for(int i=row_end;i>=row_start;i--)
	        	matrix[i][col_start] = count++;
	        col_start++;       	
		}
        return matrix;
    }
};

发表于 2017-08-02 01:33:33 回复(1)
public class Solution {
    public int[][] generateMatrix(int n) {

        int[][] matrix = new int[n][n];
        // 计算圈数
        int lvl = (n + 1) / 2;
        int temp = 1;
        for (int i = 0; i < lvl; i++) {
            // 计算相对应的该圈最后一行
            int lastRow = n - i - 1;
            // 计算相对应的该圈最后一列
            int lastCol = lastRow;
            // 如果该圈第一行就是最后一行,说明只剩下一个数
            if (i == lastRow)
                matrix[i][i] = temp++;
            else {
                // 第一行
                for (int j = i; j < lastCol; j++)
                    matrix[i][j] = temp++;
                // 最后一列
                for (int j = i; j < lastRow; j++)
                    matrix[j][lastCol] = temp++;
                // 最后一行
                for (int j = lastCol; j > i; j--)
                    matrix[lastRow][j] = temp++;
                // 第一列
                for (int j = lastRow; j > i; j--)
                    matrix[j][i] = temp++;
            }
        }
        return matrix;
    }
}
编辑于 2017-11-22 20:26:21 回复(0)
public class Solution {
   public int[][] generateMatrix(int n) {
		int[][] m = new int[n][n];
		int value = 1;
		for (int round = 0; round < n / 2 + n % 2; round ++ ) {
			for (int i = round; i < n - round; i ++ ) m[round][i] = value ++ ;
			for (int i = round + 1; i < n - round; i ++ ) m[i][n - round - 1] = value ++ ;
			for (int i = n - round - 2; i >= round; i -- ) m[n - round - 1][i] = value ++ ;
			for (int i = n - round - 2; i >= round + 1; i -- ) m[i][round] = value ++ ;
		}
		return m;
	}
}

发表于 2016-11-06 16:33:34 回复(0)
 public int[][] generateMatrix (int n) {
        // write code here
        int[][] matrix=new int[n][n];
        if(n==0) return matrix;
        int begin=0,end=n-1;  //起点坐标、终点坐标
        int i=1;  //记录当前填充值
        while (matrix[begin][begin]==0){
            if(begin==end){
                matrix[begin][begin]=i;
                break;
            }else{
                for(int j=begin;j<end;j++)  //自左向右填充上行
                    matrix[begin][j]=i++;
                for(int j=begin;j<end;j++)  //自上向下填充右列
                    matrix[j][end]=i++;
                for(int j=end;j>begin;j--)  //自右向左填充下行
                    matrix[end][j]=i++;
                for(int j=end;j>begin;j--)  //自下向上填充左列
                    matrix[j][begin]=i++;
            }
            begin++;
            end--;
        }
        return matrix;
    }

发表于 2020-08-01 10:35:27 回复(0)
public int[][] generateMatrix (int n) {
        // write code here
        int[][] result = new int[n][n];
        if(n == 0) {return result;}
        if(n == 1) {
            int[][] haha = new int[1][1];
            haha[0][0] = 1;
            return haha;
        }
        int up = 0;
        int down = n - 1;
        int left = 0;
        int right = n - 1;
        int num = 1;
        while(true) {
            //最上面一行
            for(int col = left; col <= right; col++) {
                result[up][col] = num++;
            }
            up++;
            if(up > down) {break;}
            //最右
            for(int row = up; row <= down; row++) {
                result[row][right] = num ++;
            }
            right--;
            if(left > right){break;}
            //最下
            for(int col=right;col>=left;col--) {
                result[down][col] = num++;
            }
            down--;
            if(up>down) break;
            //最左
            for(int row = down;row>=up;row--) {
                result[row][left] = num++;
            }
            left++;
            if(left > right) break;
               
        }
        return result;
    }


编辑于 2020-06-30 08:45:54 回复(0)
觉得好看的请点赞
public class Solution {
    public int[][] generateMatrix(int n) {
        int[][] result = new int[n][n];
        int num = 1;
        int rowBegin = 0, rowEnd = n - 1;
        int colBegin = 0, colEnd = n - 1;
        while(rowBegin <= rowEnd && colBegin <= colEnd)
        {
            for(int i = rowBegin; i <= rowEnd; i++)
            {
                result[rowBegin][i] = num;
                num ++;
            }
            rowBegin ++;
            for(int i = rowBegin; i <= rowEnd; i++)
            {
                result[i][colEnd] = num;
                num ++;
            }
            colEnd --;
            for(int i = colEnd; i >= colBegin; i--)
            {
                result[rowEnd][i] = num;
                num ++;
            }
            rowEnd --;
            for (int i = rowEnd; i >= rowBegin; i--) {
                result[i][colBegin] = num;
                num ++;
            }
            colBegin ++;
        }
        return result;
    }
}


发表于 2020-01-07 21:20:49 回复(0)
public class Solution {
    public int[][] generateMatrix(int n) {
        if(n < 0)
            return null;
        int[][] matrix = new int[n][n];
        int left = 0, right = n - 1;
        int up = 0, down = n - 1;
        int count = 0;
        //动态修改上下左右边界,并同时判断是否越界
        while(true){
            for(int i = left; i <= right; i++){
               matrix[up][i] = ++count;  
            }
            up++;
            if(up > down) break;
            for(int i = up; i <= down; i++){
               matrix[i][right] = ++count;
            }
            right--;
            if(right < left) break;
            for(int i = right; i >= left; i--){
               matrix[down][i] = ++count;
            }
            down--;
            if(up > down) break;
            for(int i = down; i >= up; i--){
                matrix[i][left] = ++count;
           }
           left++;
           if(right < left) break;
        }
        return matrix;
    }
}

编辑于 2020-06-23 22:56:30 回复(0)
最外圈开始,一圈一圈绕,代码如下:
public class Solution {
    public int[][] generateMatrix(int n) {
        int[][] a = new int[n][n];
        if(n==0)
            return a;
        int now = 1;
        int r,c;
        for(int i=0;i<(n+1)/2;i++){
            for(c=i;c<n-i;c++)
                a[i][c]=now++;
            c--;
            for(r=i+1;r<n-i;r++)    a[r][c]=now++;
            r--;             
      for(c--;c>=i;c--)                 
      a[r][c]=now++;             
      c++;
            for(r--;r>i;r--)                 
      a[r][c]=now++;             
      r++;         
      }
    return a;
    }

}


编辑于 2018-09-02 17:31:25 回复(1)
vector<vector<int> > generateMatrix(int n){
    int k, i, value=1,j;
    vector<vector<int> > res(n, vector<int>(n));
    for(k=0; k<(n+1)/2; k++){
        for(i=k; i<n-k; i++) res[k][i]=value++;
        for(i=k+1; i<n-k; i++) res[i][n-k-1]=value++;
        for(i=n-k-2; i>=k; i--) res[n-k-1][i]=value++;
        for(i=n-k-2; i>k; i--) res[i][k]=value++;
    }
    return res;
}

发表于 2017-04-18 11:32:15 回复(0)
class Solution {
public:
    vector<vector<int> > generateMatrix(int n) {
    int count = 1;
	int left_x = 0, left_y = 0;
	int right_x = n-1, right_y = n-1;
	vector<vector<int> > mat(n, vector<int>(n));
	while (left_x <= right_x)
	{
		for (int i = left_x; i <= right_y;i++)
		{
			mat[left_x][i] = count;
			count++;
		}
		for (int j = left_x + 1; j <= right_x;j++)
		{
			mat[j][right_y] = count;
			count++;
		}
		for (int i = right_y - 1; i >= left_y;i--)
		{
			mat[right_x][i] = count;
			count++;
		}
		for (int j = right_x - 1; j >= left_x + 1;j--)
		{
			mat[j][left_y] = count;
			count++;
		}
		left_x++;
		left_y++;
		right_x--;
		right_y--;
	}
	return mat;
  }
};

发表于 2016-09-03 01:05:40 回复(0)
/*
思路:

本题思路和螺旋遍历矩阵相同,也是需要螺旋遍历矩阵,只不过是在遍历的时候赋值

需要注意输入的n为负数

*/
class Solution {
public:
    /**
     * 
     * @param n int整型 
     * @return int整型vector<vector<>>
     */
    vector<vector<int> > generateMatrix(int n) {
        //将负数转为正数
        n = (n<0)?(0-n):n;
        vector<vector<int>> arr(n,vector<int>(n));
        if(n==0){
            return arr;
        }
        int up = 0;
        int down = arr.size()-1;
        int left = 0;
        int right = arr[0].size()-1;

        int target = 1;

        while(up<=down && left<=right){
            //从左向右搜索
            for(int col=left;col<=right;col++){
                arr[up][col] = target;
                target++;
            }
            //从上向下搜索
            for(int row=up+1;row<=down;row++){
                arr[row][right] = target;
                target++;
            }

            //边界检测
            if(up<down && left<right){
                //从右到左搜索
                for(int col=right-1;col>=left;col--){
                    arr[down][col] = target;
                    target++;
                }

                //从下到上搜素
                for(int row=down-1;row>up;row--){
                    arr[row][left] = target;
                    target++;
                }
            }

            up++;
            down--;
            left++;
            right--;
        }

        return arr;

    }
};

发表于 2023-04-10 16:47:57 回复(0)
class Solution:
    def generateMatrix(self , n ):
        # write code here
        output=[]
        for i in range(n):
             output.append([0]*n)
        t = 1
        for i in range((n+1)//2):
            if t<=n**2:
                for j in range(i,n-i):
                    output[i][j] = t
                    t+=1
            if t<=n**2:
                for k in range(i+1,n-i):
                    output[k][n-i-1] = t
                    t+=1
            if t<=n**2:
                for l in range(n-i-2,i-1,-1):
                    output[n-i-1][l] = t
                    t+=1
            if t<=n**2:
                for m in range(n-i-2,i,-1):
                    output[m][i] = t
                    t+=1
        return output
发表于 2021-11-17 15:27:43 回复(0)

定义左边界右边界(由矩阵的性质可得,左边界也是上边界、右边界也是下边界),以左边界作为循环条件,循环打印即可:

//
// Created by jt on 2020/9/29.
//
#include <vector>
using namespace std;

class Solution {
public:
    /**
     *
     * @param n int整型
     * @return int整型vector<vector<>>
     */
    vector<vector<int> > generateMatrix(int n) {
        // write code here
        vector<vector<int>> res(n, vector<int>(n));
        for (int left = 0, right = n - 1, current = 1; left <= n / 2; ++left, --right) {
            // 上
            for (int j = left; j <= right; ++j) {
                res[left][j] = current++;
            }
            // 右
            for (int j = left + 1; j <= right; ++j) {
                res[j][right] = current++;
            }
            // 下
            for (int j = right-1; j >= left; --j) {
                res[right][j] = current++;
            }
            // 左
            for (int j = right-1; j > left; --j) {
                res[j][left] = current++;
            }
        }
        return res;
    }
};
发表于 2020-09-29 11:14:32 回复(0)
/*每一个螺旋可以由起始位置确定,四角坐标表示为:
(start,start),(start,n-start-1)
(n-start-1,start),(n-start-1,n-start-1)
*/
        int[][] res = new int[n][n];
        int startIndex = 0;
        int val = 1;
        if (n < 1 || n > 1000) {
            return res;
        }
        while (startIndex <= (n - 1) / 2) {
            if (startIndex == (n - 1 / 2)) {
                res[startIndex][startIndex] = val;
                break;
            }

            for (int right = startIndex; right < (n - startIndex); right++) { //向右
                res[startIndex][right] = val;
                val++;
            }

            for (int height = startIndex + 1; height < (n - startIndex); height++) {//下
                res[height][n - startIndex - 1] = val;
                val++;
            }
            for (int left = (n - startIndex) - 2; left >= startIndex; left--) { //左
                res[n - startIndex - 1][left] = val;
                val++;
            }
            for (int up = (n - startIndex) - 2; up > startIndex; up--) { //上
                res[up][startIndex] = val;
                val++;
            }
            startIndex++;
        }
        return res;

发表于 2020-09-23 10:03:08 回复(0)
class Solution {
public:
    vector<vector<int> > generateMatrix(int n) {
        if (!n) return vector<vector<int>>();
        int i = 0, d[4][2] = {0, 1, 1, 0, 0, -1, -1, 0}, j = 0, k = -1;
        vector<vector<int>> res(n, vector<int>(n));
        for (int m = 1; m <= n * n; m++) {
            int a = j + d[i][0], b = k + d[i][1];
            if (a < 0 || a >= n || b < 0 || b >= n || res[a][b]) i = (i + 1) % 4;
            j += d[i][0];
            k += d[i][1];
            res[j][k] = m;
        }
        return res;
    }
};

发表于 2020-08-02 00:14:09 回复(0)
#

# @param n int整型 
# @return int整型二维数组
#
class Solution:
    def generateMatrix(self , n ):
        # write code here
    # write code here
        if n == 0:
            a = []
            return a
        dr = [[0, 1], [1, 0], [0, -1], [-1, 0]]
        nx, ny = 0, 0
        x, y = 0, 0
        nd = 0
        arr = [[0 for i in range(n)] for j in range(n)]
        for i in range(1, n * n + 1):
            arr[x][y] = i
            nx = x + dr[nd][0]
            ny = y + dr[nd][1]
            if 0 <= nx < n and 0 <= ny < n and arr[nx][ny] == 0:
                x = nx
                y = ny
            else:
                nd = (nd + 1) % 4
                x = x + dr[nd][0]
                y = y + dr[nd][1]
        return arr



定义方向矩阵,右下左上,然后判断只要在行和列的范围内,并且下一格是0,就把数字写入,超过行列范围就nd改方向。
发表于 2020-07-17 10:04:36 回复(0)

思路:

五个参数:left、right、top、bottom、count(计数)

循环结束条件:count == n*n

注意:四个参数的++和- -


import java.util.*;


public class Solution {
    /**
     * 
     * @param n int整型 
     * @return int整型二维数组
     */
    public int[][] generateMatrix (int n) {
        // write code here
        int[][] res = new int[n][n]; 
        if(n<1)
            return res;
        
        int left = 0;
        int right = n-1;
        int top = 0;
        int bottom = n-1;
        int count=1;

        while(count<=n*n)
        {
            for(int i = left ; i<=right ;i++)
            {
                res[top][i]=count;
                count++;
            }
            top++;
            
            for(int i=top;i<=bottom;i++)
            {
                res[i][right]=count;
                count++;
            }
            right--;
            
            for(int i=right;i>=left;i--)
            {
                res[bottom][i]=count;
                count++;
            }
            bottom--;
            
            for(int i=bottom;i>=top;i--)
            {
                res[i][left]=count;
                count++;
            }
            left++;
        }
        
        return res;
    }
}


发表于 2020-07-07 22:33:31 回复(0)
public int[][] generateMatrix (int n) {
        
        int [][] a = new int[n][n];
        int pright = n;
        int pleft = 0;
        int qright = n;
        int qleft = 0;
        int v = 0;
        while (v < n*n ){
            for (int i = qleft; i < pright; i++) {
                a[qleft][i] = ++v;
            }
            qleft++;
            for (int i = qleft; i < qright; i++) {
                a[i][pright-1] = ++v;
            }
            pright--;
            for (int i = pright-1; i >= pleft; i--) {
                a[qright-1][i] = ++v;
            }
            qright--;
            for (int i = qright-1; i >= qleft; i--) {
                a[i][pleft] =  ++v;
            }
            pleft++;
        }
        return a;
    }
发表于 2020-06-14 14:15:38 回复(0)
public class Solution {
    public int[][] generateMatrix(int n) {
        int matrix[][] = new int[n][n];
        int k =n/2+n%2;
        int count = 1;
        for(int i=0;i<k;i++){
            /*从第i行的第i列到第n-i-1列*/
            for(int j=i;j<n-i;j++,count++){
                matrix[i][j]=count;
            }
            /*从第n-i-1列的第i+1行到第n-i-1行*/
            for(int j=i+1;j<n-i;j++,count++){
                matrix[j][n-i-1]=count;
            }
            /*从第n-i-1行的第n-i-2列到第i列*/
            for(int j=n-i-2;j>=i;j--,count++){
                matrix[n-i-1][j] = count;
            }
            /*从第i列的n-i-2行到第i+1行*/
            for(int j=n-i-2;j>=i+1;j--,count++){
                matrix[j][i]=count;
            }
        }
        return matrix;
    }
}

发表于 2020-04-25 10:17:16 回复(0)