关于二维数组的小技巧(未完待续)
程序员文章站
2022-06-04 20:09:26
常常遇到这样的问题,求二维数组周边元素之和,求二维数组上三角元素之和等等,又或者会遇到这样的问题,构造一个二维数组让它的最外层是1,第二层是2…… 在此笔者简单介绍几种本人遇到过的比较简略的算法,与大家分享之。 首先容易知道,一个二维数组a[m][n]实际就是m×n矩阵,那么诸多问题都可以从线性代数 ......
常常遇到这样的问题,求二维数组周边元素之和,求二维数组上三角元素之和等等,又或者会遇到这样的问题,构造一个二维数组让它的最外层是1,第二层是2……
在此笔者简单介绍几种本人遇到过的比较简略的算法,与大家分享之。
首先容易知道,一个二维数组a[m][n]实际就是m×n矩阵,那么诸多问题都可以从线性代数的角度去理解并加以解决。另一方面,矩阵的对称性也给了我们很多的思路。
q1:求一个二维数组a[m][n]的周边元素之和
首先观察一个二维数组a[3][3]每个元素的下标(见表格1),容易观察到周边元素或者有0或者有2。那么是不是对n×n也有类似的结论呢?答案是肯定的。考虑n×n情况,第一行一定是行地址为0,第一列一定是列地址为0,而最后一行行地址则是n-1,最后一列列地址也是n-1,至此,我们已经可以找到解决表达周边元素的方法了。
因为周边元素必有一个地址是0或者n-1,同时也可以知道其他元素都不具备这样的特点(把周边元素全部遮挡起来,就变成一个n-1×n-1矩阵,此时的周边元素显然是原矩阵的1和n-2)
那么可以采用遍历的方法查找所有数组元素,再通过if语句去判断是不是具备周边元素的特点。
代码如下:
char a[n][n]; int i,j,sum; for(i=0;i<n;i++) {for(j-0;j<n;j++) {if(i==0||j==0||i==n-1||j==n-1) sum+=a[i][j]; } }
而对于m×n矩阵,同理可得。
另一种想法则是用“减法”,遍历n×n矩阵的全部元素和,再减去n-1×n-1矩阵的元素和,得到的就是周边元素的,但是显然没有上面的方法好,故略去不谈。
0,0 | 0,1 | 0,2 |
1,0 | 1,1 | 1,2 |
2,0 | 2,1 | 2,2 |
上一篇: 洛谷P4926 [1007]倍杀测量者(差分约束)
下一篇: django-2-路由配置及渲染方式