这次实验第二题难一些,一三题简单说一下思路
个人感觉这门课的测试样例很弱,弱到可以让算法产生改变,有些题看数据范围就是在考察二分,然后测试样例遍历就能过。。。对于一门数据结构课来说,就显得很离谱,在博客里轻轻吐槽下。
言归正传
第一题
给定一串输入序列,代表一棵树的后序遍历,请你判断这棵树是否是一棵二叉搜索树呢?
我的做法就是递归,复杂度是n方级别,对于这道题的数据范围来说是够用的,我看群里有大佬说可以o(n),不太理解是怎么做的。
你不可能只通过一个后序遍历序列确定一个树,但是后序遍历能很方便的看出根节点,在知道根节点的情况下,又要求是二叉搜索树,那么要求整个序列先是连续a个<根的数,跟着连续b个>根的数,然后是根节点,前a个数组成左子树,后b个组成右子树,a,b可以为零,要求二叉搜索树的左右子树也要是二叉搜索树,递归结构出来了
2 3 1 7 11 5
根节点5,二叉搜索树的左子树2 3 1,右子树 7 11
对于2 3 1,1是根节点,左子树空,右子树2 3
对于2 3,3是根节点,左子树2,右子空
对于7 11,11是根节点,左子树7,右子树空
3 1 2 5 4
根节点4,左子树3 1 2 右子树5
3 1 2根节点2,前面两个数没法分成“先是连续a个<根的数,跟着连续b个>根的数”,返回
第三题
第三题很简单,不多说了,并查集,每次输入的两个数如果是同一个集合的,那这两个点之间就是已经有通路了,你现在还要再把他俩连上,那不就出环了,当前这条边就是应该删除的边
这题我做了半天60分,一看,数据范围,点的标号<100000,就是五条边,标号不是1-6,可能是任意数。没见过这么输入的,然后样例还给的是5个边标号1-6的,然后测试样例六个点是这样的,4个点是任意标号的,无力吐槽
第二题
二分板子题,做题先看数据范围,员工价值<109,员工数量< 106
- 得开long long
- 按照压榨价值二分,压榨范围再0-价值最高的员工的价值之间,在这个范围二分,要进行log(H)次能找到答案,每次需要画o(n)从头到尾遍历一遍计算剩余价值和m比较,所以总的时间复杂度是O(log(H)*n),根据数据范围,没有超时
思路已经完整讲出来了,代码暂时不贴,因为还没到ddl