Leetcode 1203. 项目管理

news/2024/10/13 12:40:09

1.题目基本信息

1.1.题目描述

有 n 个项目,每个项目或者不属于任何小组,或者属于 m 个小组之一。group[i] 表示第 i 个项目所属的小组,如果第 i 个项目不属于任何小组,则 group[i] 等于 -1。项目和小组都是从零开始编号的。可能存在小组不负责任何项目,即没有任何项目属于这个小组。

请你帮忙按要求安排这些项目的进度,并返回排序后的项目列表:

  • 同一小组的项目,排序后在列表中彼此相邻。
  • 项目之间存在一定的依赖关系,我们用一个列表 beforeItems 来表示,其中 beforeItems[i] 表示在进行第 i 个项目前(位于第 i 个项目左侧)应该完成的所有项目。

如果存在多个解决方案,只需要返回其中任意一个即可。如果没有合适的解决方案,就请返回一个 空列表 。

1.2.题目地址

https://leetcode.cn/problems/sort-items-by-groups-respecting-dependencies/description/

2.解题方法

2.1.解题思路

拓扑排序

2.2.解题步骤

第一步,-1的组的重新定义

第二步,构建组间邻接表和组内邻接表

第三步,组间拓扑排序

第四步,组内拓扑排序

3.解题代码

Python代码

from typing import Dict,List
from collections import deque,defaultdict
# ==> 通过Dict[List]结构的邻接表图和Dict形式的入度信息进行拓扑排序,返回拓扑排序序列,如果不存在,则返回空列表
def topoSort(adjListGraph:Dict[object,List[object]],inDegreeList:Dict[object,int]):que=deque()for node in adjListGraph.keys():inDegree=inDegreeList[node]if inDegree==0:que.append(node)result=[]while que:node=que.popleft()result.append(node)for subNode in adjListGraph[node]:inDegreeList[subNode]-=1if inDegreeList[subNode]==0:que.append(subNode)return result if len(result)==len(adjListGraph) else []class Solution:def sortItems(self, n: int, m: int, group: List[int], beforeItems: List[List[int]]) -> List[int]:# 第一步,-1的组的重新定义maxGroupId=max(group)distinctGroupsSet=set()for i in range(len(group)):if group[i]==-1:group[i]=maxGroupId+1maxGroupId+=1distinctGroupsSet.add(group[i])distinctGroups=list(distinctGroupsSet)# 第二步,构建组间邻接表和组内邻接表groupsAdjList=defaultdict(list) # 组间的邻接表groupsIndegreeList=defaultdict(int) # 组间邻接表的入度表groupItemsAdjList={groupId:defaultdict(list) for groupId in distinctGroups}  # 各个组中各个元素的邻接表groupItemsIndegreeList={groupId:defaultdict(int) for groupId in distinctGroups}  # 各个组中各个元素的邻接表的入度信息for groupId in distinctGroups:groupsAdjList[groupId]=[]for i in range(n):itemId,groupId,beforeIds=i,group[i],beforeItems[i]for beforeId in beforeIds:beforeGroupId=group[beforeId]if beforeGroupId!=groupId and groupId not in groupsAdjList[beforeGroupId]:groupsAdjList[beforeGroupId].append(groupId)groupsIndegreeList[groupId]+=1if beforeGroupId==groupId:groupItemsAdjList[groupId][beforeId].append(itemId)# print(groupItemsIndegreeList[groupId])groupItemsIndegreeList[groupId][itemId]+=1if itemId not in groupItemsAdjList[groupId]:groupItemsAdjList[groupId][itemId]=[]# 第三步,组间拓扑排序groupSortArr=topoSort(groupsAdjList,groupsIndegreeList)if not groupSortArr:return []# print(groupSortArr)# 第四步,组内拓扑排序result=[]for groupId in groupSortArr:thisItemsArr=topoSort(groupItemsAdjList[groupId],groupItemsIndegreeList[groupId])# print(groupId,thisItemsArr,groupItemsAdjList[groupId])if not thisItemsArr:return []result.extend(thisItemsArr)# print(result)return result

4.执行结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/71044.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

实验2 c语言分支与循环基础应用编程1

task1:问题1 随机数求余后结果为1,生成0397到0476中的随机数 问题2 随机数求余后结果为0,生成0001到0021中的随机数 问题3 随机生成5个不同的学号 task2: 实验3: task4:1 #include <stdio.h>2 int main()3 {4 double x,sum,max,min;5 sum = 0;6 max = 0;7…

2024-2025-1 20241421 《计算机基础与程序设计》第三周学习总结

这个作业属于哪个课程 2024-2025-1-计算机基础与程序设计)这个作业要求在哪里 https://www.cnblogs.com/rocedu/p/9577842.html#WEEK03(https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP/homework/13276))这个作业的目标 1、数字分类与计数法位置计数法,2、进制转换,…

在wsl上配置vscode和c++环境

在wsl中配置Ubuntu在power shell中输出指令,更新并检查版本wsl --update wsl --version输出: WSL 版本: 2.3.24.0 内核版本: 5.15.153.1-2 WSLg 版本: 1.0.65 MSRDC 版本: 1.2.5620 Direct3D 版本: 1.611.1-81528511 DXCore 版本: 10.0.26100.1-240331-1435.ge-release…

如何在kubernetes环境中共享GPU

随着人工智能和大模型的快速发展,云上GPU资源共享变得必要,因为它可以降低硬件成本,提升资源利用效率,并满足模型训练和推理对大规模并行计算的需求。 在kubernetes内置的资源调度功能中,GPU调度只能根据“核数”进行调度,但是深度学习等算法程序执行过程中,资源占用比较…

WGCLOUD使用笔记 - 监测主机的Crontab定时任务信息

Crontab定时任务监测,是WGCLOUD v3.5.5 新增的一个功能模块可以实时监测Linux的Crontab设置信息,如下图

高级程序语言设计课程第三次个人作业

班级的链接:https://edu.cnblogs.com/campus/fzu/2024C/ 作业要求的链接:https://edu.cnblogs.com/campus/fzu/2024C/homework/13284 学号:102400228 姓名:吴昊 第四章作业: 第二题:本题在b.d要求读题时有部分困难,最后通过网上查询解决自己的困难 第三题:本题没什么大…

golong下载

https://www.cnblogs.com/se6c/p/17890974.html#gallery-2 目录中文网官网编译器下载额外步骤:加速访问配置 GOPROXY 环境变量,以下三选一给你们看下我的这一步步骤(我选的阿里) 中文网首页 - Go语言中文网 - Golang中文社区官网The Go Programming Language编译器下载1.我…

通过LambdaQueryWrapper配置实现查询指定的字段值

如果是自己写sql语句,可以很自由的实现查询哪些字段值,但是在使用 MybatisPlus 提供的CRUD方法的时候我们该如何实现这一效果呢? 可以通过 LambdaQueryWrapper 和 QueryWrapper 的 select 方法来做到这一点public IPage<Customer> page(int current, int size) {log.i…