【Leetcode】59. 螺旋矩阵 II

题目描述:

给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。

示例:

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

解题思路:

螺旋矩阵的问题就是把1->n*n的序列依次填进矩阵中。都是从最外层填到最内层。

AC代码:

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
         vector<vector<int>>res(n,vector<int>(n,0));
         int count=1;
         int x=0,y=0;
         res[0][0]=count;
         while(count<n*n)
         {
             while(y+1<n&&!res[x][y+1])
                res[x][++y]=++count;
             while(x+1<n&&!res[x+1][y])
                res[++x][y]=++count;
             while(y-1>=0&&!res[x][y-1])
                res[x][--y]=++count;
             while(x-1>=0&&!res[x-1][y])
                res[--x][y]=++count;
         }
         return res;
    }
};

问题进阶:

外螺旋、内螺旋和三角螺旋矩阵:

//内螺旋
vector<vector<int>> generateMatrix_I(int n) 
{
	vector<vector<int> >res(n, vector<int>(n, 0));
	int count = 1;
	int x = 0, y = 0;
	res[0][0] = count;
	while (count<n*n)
	{
		while (y + 1<n && !res[x][y + 1])
			res[x][++y] = ++count;
		while (x + 1<n && !res[x + 1][y])
			res[++x][y] = ++count;
		while (y - 1 >= 0 && !res[x][y - 1])
			res[x][--y] = ++count;
		while (x - 1 >= 0 && !res[x - 1][y])
			res[--x][y] = ++count;
	}
	return res;
}
//外螺旋
vector<vector<int>> generateMatrix_O(int n)
{
	vector<vector<int> >res(n, vector<int>(n, 0));
	int count = n*n;
	int x = 0, y = 0;
	res[0][0] = n*n;
	while (count>1)
	{
		while (y + 1<n && !res[x][y + 1])
			res[x][++y] = --count;
		while (x + 1<n && !res[x + 1][y])
			res[++x][y] = --count;
		while (y - 1 >= 0 && !res[x][y - 1])
			res[x][--y] = --count;
		while (x - 1 >= 0 && !res[x - 1][y])
			res[--x][y] = --count;
	}
	return res;
}
//三角螺旋
vector<vector<int>> generateMatrix_T(int n)
{
	vector<vector<int> >res(n, vector<int>(n, 0));
	int count = 1;
	int x = 0, y = 0;
	res[0][0] = count;
	while (count<(n*(n+1)/2))
	{
		while (y + 1<n && !res[x][y + 1])
			res[x][++y] = ++count;
		while (x + 1<n && !res[x + 1][y-1])
			res[++x][--y] = ++count;
		while (x - 1 >= 0 && !res[x - 1][y])
			res[--x][y] = ++count;
	}
	return res;
}

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值