算法题个人思路总结

Posted dalt

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法题个人思路总结相关的知识,希望对你有一定的参考价值。

1.设A与C是互质的两个数,求B,使得A*B=1(mod C)。

解:由于gcd(A,C)=1,因此利用扩展欧几里德函数可以找到a*A+c*C=1,即a*A=1(mod C)。我们取B=a即可。

 

2.求$sum_{i=1}^n{frac{1}{i}}$的上下界。

解:$ln left( n+1 ight) le int_1^{n+1}{frac{1}{x}dx}le sum_{i=1}^n{frac{1}{i}}le 1+int_1^n{frac{1}{x}dx}=1+ln left( n ight) $。

 

3.求形如$sum_{i=1}^n{i^{alpha}}$的上下界,其中α>=0。

解:$1+frac{1}{alpha +1}left( n^{alpha +1}-1 ight) =1+int_1^n{x^{alpha}dx}le sum_{i=1}^n{i^{alpha}}le int_1^{n+1}{x^{alpha}dx}=frac{1}{alpha +1}left( left( n+1 ight) ^{alpha +1}-1 ight) $。

 

4.要求大批量查询区间最大值最小值,区间不会被修改。

解:使用ST算法在长度为n的区间上以时空复杂度O(nlog2n)做预处理,并以O(1)时间复杂度做查询。

 

5.在一株树上统计路径信息。

解:使用LCT,所有操作时间复杂度均为O(log2n)。

 

6.数据范围较大,但实际数据较少。

解:离散处理。

 

7.要求多次处理树上差分,每个结点对应一组值。

解:树上每个结点对应一个持久化线段树,并且子结点的持久化线段树在父结点的持久化线段树上创建。

 

8.给定n大小不变区间,区间值最大值为k,m次查询区间第k小。

解:将区间视为一株树,下标i对应i+1的父结点,问题相当于在树上做差分。查询区间[l,r]上第k小,等价于查询持久化线段树r与持久化线段树l-1的差分对应的线段树上第k小元素。时间复杂度为O((n+m)log2(k))。

 

9.给定一株含n个结点的树,m次查询lca。

解:1.先利用dfs将树压成区间,之后利用st处理区间最小值和最大值。时间复杂度为O(2nlog2(n)+m)。

  2.如果允许离线处理,则利用tarjan算法可以在O(n+m)时间复杂度内求出。

 

10.给定长度为n的字符串,m次判断两个子串是否相同。

解:在字符串上进行hash处理,之后以O(1)实际复杂度取子串哈希值并进行比较。实际复杂度为O(n+m)。注意要小心生日悖论,如果哈希范围为k,则只需要sqrt(k)个不同子串就有1/2以上的概率使得存在两个子串拥有相同哈希值,这时候可以多次进行哈希,从而提高k的范围。

 

11.平面上n个矩形,求被这些矩形覆盖的面积。

解:先对矩形按照矩形底部y坐标进行从小到大排序。之后用扫描线算法从左到右扫描矩形左右边界。总的时间复杂度为O(n^2)。

 

以上是关于算法题个人思路总结的主要内容,如果未能解决你的问题,请参考以下文章

前端算法-leetcode刷题推荐

leetcode算法题基础(三十九) 递归总结

滴滴2019年php高级研发工程师面试题总结

leetcode之贪心算法刷题总结1

九章算法刷题总结

常用算法思路分析系列链表相关高频题集