螺旋数组类的题目是面试时常常会碰到的问题,这里针对常见的螺旋数组及其变种做了一个总结,希望能更多地掌握这一类题目的解法。
一般来说,螺旋数组都是由下面的这道题目变化而来。先看下这道基础的原题:
题目描述:
输入一个数字n,输出一个n*n的二维数组,使其按照从外到内,顺时针的格式打印出来。
case:
输入
4
输出
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
这道题目很常见,总的来说可以采用俩种思路来实现。
一是模拟法,空间复杂度是O(n*n);二是找规律法,空间复杂度是O(1)。
思路1:通过模拟螺旋数组的旋转操作,在此过程中不断地给二维数组a[][]的元素a[i][j]赋值,直到二维数组的所有元素都被赋值即可。这个思路需要预先开辟一个二维的数组a[n][n],占用的空间复杂度是O(n*n);
思路2:通过分析螺旋二维数组的特点,找到每个元素a[i][j]和n之间的关系,从而直接在打印二维数组的每个元素时,直接计算出该元素的值,将其打印出来,因此无需预先开辟一个数组,空间复杂度降低到O(1)。
下面来实现这两种算法:
思路1:首先我们将二维数组看成是一个坐标轴,坐标原点是对应着元素的下标(0, 0),X轴的正方向向右,Y轴的正方向向下。实现思路1时,又有两种方法:
一种是通过控制边界的方法,即通过控制X轴和Y轴的起始边界beginX,endX,beginY,endY,来模拟数组元素的螺旋赋值操作;
另外一种是通过移动坐标(x, y)的方法,即通过每次进行(y++,x++,y--,x--)这四个操作中的任何一个来模拟螺旋赋值操作,这种方法在应用到变种问题由内向外打印螺旋数组时也很方便。
思路1-1:控制边界法,空间复杂度O(n*n)
初始化最外面一层的边界:
beginX = 0;
endX = n - 1;
beginY = 0;
endY = n - 1;
此后不断增加beginX和begi