题解 | #牛牛吃水果的顺序#

牛牛吃水果的顺序

https://www.nowcoder.com/practice/336b43ff1d664cdd8e3e39acb67dfa39

from sys import float_repr_style
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param numFruits int整型 
# @param prerequisites int整型二维数组 
# @return int整型二维数组
#
class Solution:
    def findFruitOrder(self , numFruits: int, prerequisites: List[List[int]]) -> List[List[int]]:
        # write code here
        # 找出所有符合要求的顺序
        # 用一个q来记录下一个要吃的水果
        ans = []
        visited = set()
    
        n = numFruits
        # 用字典来存储prereq,方便查询
        prev = dict()
        for idx, req in prerequisites:
            if idx not in prev:
                prev[idx] = [req]
            else:
                prev[idx].append(req)
        # 用dfs记录path
        try_visited = set()
        def dfs(idx, path, left): #
            temp = str(idx) + str(path) + str(left)
            if temp in try_visited:
                return # 已经访问过了
            try_visited.add(temp) # 记录这次访问
            # print(temp)
            if len(left) == 0:
                ans.append(path.copy())
                return 
            
            # check idx
            pre = prev.get(idx, []) # 前置点
            path_set = set(path)
            left_pre = []
            for ele in pre:
                if ele in path_set: # 已经满足了
                    continue
                else:
                    left.remove(ele) # 先移除,后面放到前面
                    left_pre.append(ele) # 尚未满足

            left = left_pre + left # 重新排序
            
            if len(left_pre) == 0: # 如果前置都满足了,该点可以加入了
                path.append(idx)
                left.remove(idx)
                if not left:
                    dfs(-1, path, left) # 只用记录
                else: # 进行下一个点的check
                    for i in range(len(left)):
                        next_id = left[i]
                        dfs(next_id, path, left.copy()) # 进一步, 需要用copy,因为left会remove
                # clean
                path.remove(idx)
                left.append(idx)
            else: # 有前置条件不满足,先满足前置点
                # 调整left顺序后,重新检查
                for ii in left_pre:
                    dfs(ii, path, left) # redirect
                return
        
        dfs(0, [], list(range(n)))
        return ans

需要记录path,所以用dfs。每次检查所有前置点是否满足,如果不满足则调整执行顺序。感觉还有很大优化空间。

全部评论

相关推荐

是每个人事都这样与找工作的人这样沟通吗?正常询问不可以吗
据说名字越长别人越关注你的昵称我觉得我要被关注了:excal 我还真不会
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务