原题目见:http://blog.youkuaiyun.com/aegeaner/article/details/6744011
如果使用二维数组,空间复杂度为O(N^2),事实上本题可以计算A[i][j]的通项公式,这样可以不用额外的矩阵存储空间,空间复杂度降为O(1)。
思想是考虑从左上角开始的i*i子矩阵,只要在子矩阵扩张的外围补充(i*i+1)~(i+1)*(i+1)的序列即可。又可以看做是(i+1)^2加上一个修正值(负数)序列。而对角线上的修正值正好是层数的相反数,以此左右上下增减即可。这个技巧主要是利用了对称。
代码如下:
#include <cstdio>
#include <algorithm>
using namespace std;
int Layer(int i, int j)
{
return max(i, j);
}
int Fix(int i, int j, int n)
{
int flag;
if(n % 2 == 0)
flag = -1;
else
flag = 1;
// if(i == j)
// return -n;
// else
return -n + flag * (i - j);
}
int main()
{
int N;
while(scanf("%d", &N) != EOF)
{
for(int i = 0; i < N; i++)
{
for(int j = 0; j < N; j++)
{
int n = Layer(i, j);
printf("%4d ", (n + 1) * (n + 1) + Fix(i, j, n));
}
putchar('\n');
}
}
return 0;
}