第3题个人想法,(Java):用图表示各个任务之间的关系,图最终会是directed graph(如: a -> b 代表完成a才能完成b,这里b是a的邻居而a不是b的邻居(也不可能是,否则将死循环))(这里我会不停的使用node和任务这两个名词,它们代表一样的东西) 1)创造一个数组叫作neighbours, neighbours[i] 是一个LinkedList<Integer> 代表i的所有neighbour nodes. 2)创造一个数组叫做result, 用于记录最终任务顺序。在这里,添加任务时从数组的最后端开始添加,也就是说先添加最后完成的任务(原因在第4步) 3)创建一个数组visited, visited[i] = true 代表任务i/node i已经被加入result中 4) for i = 0,1,2,...,n, 对于node i 我们执行dfs(i) (如果visited[i] = true, 直接skip). 但这里需要对dfs稍做改变。改变为: 对于所有node i,只有当对其所有邻居都执行完dfs并回溯到自己本身(node i)时,才能把任务i添加到result中(记得是由后往前添加)并且set visited[i] = true。因为这样的话,对于所有node来说,当我们回溯到某个node时说明此node能解锁的任务都已添加到result了,这时我们可以在不影响正确性的情况下将此node添加到result中。 5)return result; 设n = 任务数量 设v = input 数组的数量 (也就是在以上算法中的number of directed edges) 时间复杂度:O(v + n) = O(v) (因为v >= n)
1 2

相关推荐

牛客网
牛客企业服务