1. 快排每次以第一个作为主元,问时间复杂度是多少?(O(N*logN))
2. T(N) = N + T(N/2)+T(2N), 问T(N)的时间复杂度是多少?(O(N))
3. 从(0,1)中平均随机出几次才能使得和超过1?(e)
4.编程题:
一棵树的节点定义格式如下:
struct Node{
Node* parent;
Node* firstChild; // 孩子节点
Node* sibling; // 兄弟节点
}
要求非递归遍历该树。
思路:采用队列存储,来遍历节点。
5. 算法题:
有N个节点,每两个节点相邻,每个节点只与2个节点相邻,因此,N个顶点有N-1条边。每一条边上都有权值wi,定义节点i到节点i+1的边为wi。
求:不相邻的权值和最大的边的集合。
思路:
上图形象的表示了题目中的点与线的关系。
看到题目,初步猜到可以用到线性规划的思想。
定义f(k)为:前k条边中的最大的权值和。
则,f(k) = max{f(k-1), f(k-2) + wk}
根据该就可以在O(N)下求得最大权值和。
为了保存最大权值和对应的边集合,我们对每一个k,保存一个集合来保存对应的边集合。
因此,有:
f(0) = w0;
f(1) = w1;
for (i = 2: N-2)
if f(i-1) > f(i-2)+wi
Set(i) = Set(i-1);
f(i) = f(i-1);
else
Set(i) = Set(i-2) <= i; // 将i加入集合
f(i) = f(i-2)+wi;
end;
end;
以上就是本人能想到的解法,如果有更好的解法,欢迎不吝赐教。