本文共 814 字,大约阅读时间需要 2 分钟。
原题目见:
如果使用二维数组,空间复杂度为O(N^2),事实上本题可以计算A[i][j]的通项公式,这样可以不用额外的矩阵存储空间,空间复杂度降为O(1)。
思想是考虑从左上角开始的i*i子矩阵,只要在子矩阵扩张的外围补充(i*i+1)~(i+1)*(i+1)的序列即可。又可以看做是(i+1)^2加上一个修正值(负数)序列。而对角线上的修正值正好是层数的相反数,以此左右上下增减即可。这个技巧主要是利用了对称。
代码如下:
#include#include 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;}
转载地址:http://zanbb.baihongyu.com/