栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

lc59 螺旋矩阵超详细剖析。(c++)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

lc59 螺旋矩阵超详细剖析。(c++)

思路

按照要求,设置初始位置为(0,0),然后通过从左往右,从上到下,从右往左,从下到上的模拟方法生成矩阵。

细节
  1. 闭开的原则什么??

    因为要实现4次循环,所以我们要规定区间的闭开原则,否则会因为区间的闭开原则不一致导致漏掉某些数据。这里我们选择左闭又开[x,y)。

  2. 特殊情况有木有??

    对于n为奇数的情况,矩阵中心要单独赋值。矩阵中心的位置为(n/2,n/2).比如n=3。矩阵中心(1,1).

    123
    894
    765

​ 3.怎么根据n判断有几层螺旋圈?

​ 这里我只能列举了,最后发现是有n/2次循环。 (1,0)(2,1)(3,1),(4,2)(5,2)…到最后其实发现,n每逢一个偶数加 一次螺旋圈。!!这不就是等差数列嘛。所以 最后就是n/2啦。

​ 4.每层螺旋圈后,初始位置和每个循环的结束位置怎么更新?

​ 对于起始位置(beginRow,beginCol),会发现他们其实是在斜对角线上。所以进入下一个螺旋圈前分别+1 即可。

​ 对于循环结束位置。这里需要增设一个变量offset,用来控制结束位置更新。那怎么根据n和(beginRow或者 beginCol)更新呢?

​ 因为每次进入下一个圈,访问的数目减少。最后要让结束位置

如果没听懂,那还是列举吧。每圈结束位置的绝对位置是-1的.n=6时有3圈。

nbeginRowoffset结束位置
6015(x的值)
6134(x的值)
6253(x的值)

可以很容易推出offset是每次加2的。

vector>ans(n,vector(n,0));//声明一个n*n的值全为0的二维矩阵。
int beginRow=0,beginCol=0;//row行,Col列;
int loop=n/2;
int mid=n/2;
int count=1;//用来给每个内容块赋值
int i,j;
int offset=1;//初始设为1,第一圈是1
while(loop--){
	i=beginRow;
    j=beginCol;
    //从左往右,因为是横向遍历,所以需要改变j
    for(j=beginCol;jbeginCol;j--){
        ans[i][j]=count++;
    }
    //从小往上
    for(;i>beginRow;i--){
        ans[i][j]=count++;
    }
    beginRow++;
    beginCol++;
    
    //
    offset+=2;
    if(n%2){
        ans[mid][mid]=count;
	}
}
return ans;
举一反三(逆时针螺旋)
vector>ans(n,vector(n,0));
	 int beginRow=0,beginCol=0;
	 int loop=n/2;
	 int mid=n/2;
	 int offset=1;
	 int count=1;
	 int i,j;
	 //定义左闭右开 
	 while(loop--){
	 	i=beginRow;
	 	j=beginCol;
	 	//从上到下 
		for(i=beginRow;ibeginRow;i--){
			ans[i][j]=count++;
		}
		//从右到左 
		for(;j>beginCol;j--){
			ans[i][j]=count++;
		}
		beginRow++;
		beginCol++;
		//控制遍历次数 
		offset+=2;
	
	 }
	if(n%2){
		ans[mid][mid]=count;
	}
	return ans; 

运行结果:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/664920.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号