九章算法官网-原文网址
http://www.jiuzhang.com/problem/29/
题目
给定n*n的矩阵,需要查询任意子矩阵中所有数字的最大公约数。请给出一种设计思路,对矩阵进行预处理,加速查询。额外的空间复杂度要求O(n^2)以内。
解答
构建二维线段树。预处理时间O(n^2),每次查询O(log n)
面试官角度
这个题目需要具备一定的数据结构功底。线段树(Interval Tree)可以解决的问题是那些满足结合律的运算。最大公约数是一个满足结合律的运算。所以有,GCD(A,B,C,D) = GCD(GCD(A,B), GCD(C, D)) 。同样具备结合律的运算有PI,SUM,XOR(积,和,异或)。线段树的基本思想是,将区间[1,n]查分为[1,
n/2], [n/2+1,n]这两个子区间,然后每个子区间继续做二分,直到区间长度为1。在每个区间上维护这个区间的运算结果(如GCD,SUM),需要查询某一段区间的结果时,将该区间映射到线段树上的若干不相交的区间,将这些区间的结果合并起来则得到了答案。可以证明任何一个区间可以映射到线段树上不超过O(log n)个区间。上面介绍的是一维的线段树,对于二维的情况,可以采用四分或者横纵剖分的方法来构建线段树。
时间: 2024-10-29 22:21:14