码迷,mamicode.com
首页 > 编程语言 > 详细

九章算法面试题29 子矩阵的最大公约数

时间:2015-05-12 15:48:12      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:线段树   leetcode   lintcode   九章算法   面试题   

九章算法官网-原文网址

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)个区间。上面介绍的是一维的线段树,对于二维的情况,可以采用四分或者横纵剖分的方法来构建线段树。



九章算法面试题29 子矩阵的最大公约数

标签:线段树   leetcode   lintcode   九章算法   面试题   

原文地址:http://blog.csdn.net/jiuzhang_ninechapter/article/details/45669135

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!