Transcript 1 排序分治
连线(Lining Up) • 事实上,飞行员面临的可不是个简单的任 务。她要把物品空投到处于危险地带的一 些指定的地点。并且,飞行员只能按一条 直线飞过该区域一次,并尽可能多的飞越 指定地点。所有的地点都以坐标点的形式 标记在一个二维空间中。飞行员想知道这 些点中处于同一条直线上的点的最大数目 是多少。你能编写一段程序计算这个数 吗? 解题思路 • 以一个点为基点,对其它所有点连线,然 后对这些线的斜率进行排序,统计有多少 斜率相同的线。遍历每一个点,以其为基 点进行尝试,统计能得到的最大值。 • 斜率的计算最好不要用浮点数。两个斜率 m1/n1和m2/n2的比较,等价于abs(m1*n2) 和abs(m2*n1)的比较 区间(Intervals) • 给定 n 个闭区间 [ai; bi],其中i=1,2,...,n。 这 些区间可以用一组不间断的闭区间表示。 我们的任务是找出其中区间数最少的表示, 并把它们按升序输出。所谓升序,即对于 区间[a;b] 和[c;d]是升序的,当且仅当a ≤ b < c ≤ d。 解题思路 • 对所有区间进行排序,排序的原则是起点 在数轴靠上左的排在前面 • 左到右查看当前区间的终点是否超越下一 个区间的起点,如果是,则合并区间 建筑轮廓问题 • 对于城市中几座建筑外形,给出这些建筑 的二维轮廓。 解题思路 • 轮廓可用“区间+高度”来表示。两个轮廓 合并,需要两个轮廓同时从左到右遍历, 挑出每段区间的最高点,复杂度为O(n)。 • 程序整体的结构可参照归并排序,整体算 法复杂度为O(nLogn) • 程序实现比较繁琐,需细心 木棒问题 • XX有n根长度不同的木棒,有一天它把所有的 木棒排成一行,用S1,S2,S3,...,Sn表示.量出每 个木棒的长度Sk(1<=k& lt;=n),它发现有两个 木棒Si和Sj(1< = i < j < = n),它们之间的所有木 棒都比Si要长比Sj短. 现在给出每个木棒的长度,你需要找到满足 上述条件的两个木棒Si和Sj,使得j-i最大. (请使用分治法解此题) 解题思路 • 等价于求最长上升子序列 • 给出两个数组,A和B,已知A和B中的最长 上升子序列,那么A和B连接之后的最长子 序列需要从以下三个候选中挑出:A中最长 上升子序列、B中最上上升子序列、A尾部 的最长上升序列和B头部的最长上升序列的 合并。结合部的计算复杂度为O(n),整体复 杂度为O(nlogn) 斐波那契数 • 斐波那契数列是指如下数列: F(0)=0, F(1)=1, F(n)=F(n-1)+F(n-2).数列的前10个数如下: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, … 对于给定的数n,请求出F(n)的后四个数字. 解题思路 F ( n) F (n 1) F ( n) F (n 1) F (n 1) 1 1 F ( n) F (n 1) F (n 2) 1 0 矩阵乘方和 • 给出一个n*n的矩阵和正整数k,请求出 S=A+A^2+A^3+A^4+...+A^k的值.A^x表示x个A 相乘的结果. 解题思路 • S(n) = A + A^2 + A^3 + ….. + A^n • n为偶数 S(n) = S(n/2) + F * S(n/2) F = A^(n/2) • N为奇数 S(n) = A + A * S((n-1)/2) + F * S((n-1)/2) F = A^((n-1)/2) • 计算F时可利用计算S([n/2])时算得的F