螺旋矩阵II(太棒了!第一次自己做出来没看答案!虽然花了30分钟哈哈)


思路:
- 对于这种四个方向有规律的变化,最好采用同一套模式执行 例如:

那么不管遇到n=100,99,98都不怕,都套进去就可以啦!
那么我们就要注意:
- 确定圈数
- 是否要处理中间位置
- 四个方向如何表示(4个for循环)【这里有点难,光看是没有用的,建议自己画一个n=4的数组,然后把对应的下标标记出来,看看规律】
for(j=count;j<n-1-count;j++) num[count][j]=a++;
(count表示从0开始数的圈数,n-1-count是因为随着圈数的增加,我们覆盖数组的范围会越小)

比如
第二圈就要减去1 2这两列
另外三个就是:
for(i=count;i<n-1-count;i++) num[i][j]=a++;
for( ;j>count;j--) num[i][j]=a++;
for( ;i>count;i--) num[i][j]=a++;
(为什么后面两个是>count,是因为count从0 1 2依次递增的时候,回收也是随着圈数的增加i j是小到0,小1......)
class Solution { public int[][] generateMatrix(int n) { int[][]num=new int[n][n]; if(n==1) { num[0][0]=1; return num; } if(n%2==1) num[n/2][n/2]=n*n; int loop=n/2; int i=0,j=0,count=0,a=1; while(count<loop){ for(j=count;j<n-1-count;j++) num[count][j]=a++; for(i=count;i<n-1-count;i++) num[i][j]=a++; for( ;j>count;j--) num[i][j]=a++; for( ;i>count;i--) num[i][j]=a++; count++; } return num; } }
逆时针螺旋数组:
while(count<loop){
//顺时针从右上角开始,需要改的是j坐标
for(j=n-count-1;j>count;j--)result[count][j]=a++;
for(i=count;i<n-count-1;i++) result[i][j]=a++;
for(;j<n-count-1;j++) result[i][j]=a++;
for(;i>count;i--) result[i][j]=a++;
count++;
}
区间和

前缀和不多说啦,高中知识:

总结
- 数组是存放在连续内存空间上相同类型的数据集合
- 通过下标可以访问(支持随机访问的),下标从0开始
- 数组元素不能删除,只能覆盖
- java中 二维数组中例如int[2][4],不是2*4的连续空间!而是类似这种

因此应该是4条连续的空间
数组涉及到的算法思路:
- 二分法(注意最好采用左闭右闭区间,while(<=))
- 双指针(做到覆盖动作,按照递增/减从数组中取值的动作,1个for完成2个for的事)
- 前缀和(记住公式)
- 模拟题(需要借助画图,自己找规律)
- 滑动窗口(看上去有两个循环,实际快慢指针都各自只访问元素一次,外循环定终止位置,内循环试探最短的窗口长度。记住模板)


4615

被折叠的 条评论
为什么被折叠?



