2道拓扑排序的题目,区别是207只需要判断是否存在,210需要输出结果,其实难度是一样的。
关键在于效率,brute force怎么都可以做出来。
关键在于,我们要能迅速找到 删除某些点后 ,剩下哪些点的入度为0。
不难想到利用集合。
首先从输入数据 获取每个点 被哪些点依赖 比如 1->2 1->3 则 1被2,3依赖(所以后面删除1后,2,3两个点的入度要-1)。
接着我们维护一个全局hashmap,记录当前每个点的入度值。
再维护一个hashset数组,数组的下标就是入度,在这里存储 是当前入度值的 所有点的集合。
于是,我们就只考虑hashset下标为0的项(也就是入度为0的点的集合)。 每次从中随机选一个(这个点入度为0,可以放心删掉,也就是作为210的一个结果点),然后 获取被它所依赖的点。对于每个这样的点,首先从hashmap中查询它的入度,把它从对应hashset中删去,把它添加到 另一个hashset中(入度-1的地方),同时更新它在hashmap中的值。 接着进入下一轮循环,仍然只考虑hashset下标为0的项。
最后如果能选的点的个数 就是原来输入的点的个数,则正确,否则错误。