HHU 暑假第二弹 数据结构初步

来源:互联网 发布:西溪悦榕庄 知乎 编辑:程序博客网 时间:2024/06/04 19:52

写在前面(^_^)

  本周的训练专题是基础的数据结构,主要涉及到栈、队列(优先队列)、二叉树(二叉搜索树、完全二叉树、满二叉树)、散列(数字哈希)。


1000. 二叉搜索树(hdoj 3791)

题意

  判断两个序列是否同为一棵二叉搜索树。

题解

  这是一道很基础的纯数据结构题,数据量很小。先建立二叉搜索树(相关内容可参考该博客),然后进行先序遍历或者后序遍历,比较得到的两个序列即可。


1001. Matrix Chain Multiplication(hdoj 1082)

题意

  给出n个矩阵的行数和列数(例:A 2 3 ; B 3 4),并给出矩阵相乘运算的表达式(例:(AB)),若不可以运算输出“error”,若可以运算输出运算过程中一共发生了多少次乘法运算。

题解

  1.两个矩阵可以运算的条件A.col==B.row;
  2.采用栈stack对表示式进行模拟处理;遇到‘(’跳过,遇到字母入栈;遇到‘)’栈顶的两个矩阵出栈,并对其进行运算(一定要注意两个矩阵的先后顺序),如果可以运算,把运算结果入栈。


1002. Sliding Window(poj 2823)

题意

  有n个窗口,有一个窗口容量为k的滑动窗口,每次向右滑动一个窗口,问当前滑动窗口的最大值和最小值。

题解

  1.最多有1000000个窗口,暴力求解的复杂度为o(nk),最坏情况下可达到10的12次方,很有可能超时。
  2.采用优先队列(priority_queue)的数据结构,需存储每个窗口的value和index,使用两个优先队列,一个递增一个递减(以value大小作为比较标准)。遍历一次,若队首元素的index<=i-k,则将队首元素抛出,直至队首元素的index>i-k,则该队首元素为当前滑动窗口的最大/小值。


1003. Subtree(hdoj 5524)

题意

  求一棵完全二叉树,有多少种子树包含的节点数量不同。

题解

  1.如果一棵完全二叉树是满二叉树,则其子树依然是满二叉树;如果完全二叉树不是满二叉树,则其中一棵子树是满二叉树,另一棵是完全二叉树。
  2.基于以上两点,可以根据结点的数量,进行递归求解。


1004. Snowflake Snow Snowflakes(poj 3349)

题意

  雪花有6瓣,每瓣用一个整数表示,问有没有完全相同的两朵雪花。两朵雪花完全相同的条件是:以顺时针或者逆时针(两种顺序均可)的顺序,6瓣对应相等。

题解

  1.最多有100000朵雪花,如果以简单粗暴的方法(复杂度o(n2))可能会超时。
  2.采用数字哈希的方法,可以以(6瓣数字之和 % 较大素数)作为关键字,将雪花分类,即可降低复杂度。如果两朵雪花完全相同,则一定属于同一类(或一定具有相同的关键字)。

0 0
原创粉丝点击