Leetcode 1203. 项目管理

server/2024/10/19 15:44:05/

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.ppmy.cn/server/132356.html

相关文章

打造直播美颜平台的关键技术:视频美颜SDK的深度解析

本篇文章,小编将深入解析视频美颜SDK的关键技术,探讨其在打造直播美颜平台中的作用。 一、视频美颜SDK的定义与功能 视频美颜SDK是一套专门为实时视频处理而设计的软件开发工具包。其主要功能包括人脸检测、肤色美化、瑕疵修复、虚化背景、实时滤镜等。…

“国货户外TOP1”凯乐石签约实在智能,RPA助力全域电商运营自动化提效

近日,国货第一户外品牌KAILAS凯乐石与实在智能携手合作,基于实在智能“取数宝”自动化能力,打通运营数据获取全链路,全面提升淘宝、天猫、抖音等平台的运营效率与消费者体验,以自动化能力驱动企业增长。 KAILAS凯乐石…

【2024最新】一步在电脑上安装Win11虚拟机

一步在电脑上安装Win11虚拟机 先介绍一下win11: Windows 11 是微软最新的操作系统,旨在提供更直观、更高效的用户体验。以下是一些主要特点和功能: 简洁易用:Windows 11 的界面设计更加简洁,任务栏居中,开…

UE4 材质学习笔记05(凹凸偏移和视差映射/纹理压缩设置)

一.凹凸偏移和视差映射 1.偏移映射 这需要一个高度图并且它的分辨率很低,只有256*256,事实上,如果高度图的分辨率比较低并且有点模糊,效果反而会更好 然后将高度图输出到BumpOffset节点的height插槽中, 之后利用得到…

俄语生活日用品词汇大全,柯桥成人俄语培训机构推荐

очки 眼镜 полотенце 毛巾 купальное(банное)полотенце 浴巾 зажимы 窗帘夹 носовой платок 手帕 дорожка 长条的粗地毯 ковер 地毯;壁毯 маникюрный набор 一…

idea中高级实用的调试技巧

1 条件断点&#xff0c;比如&#xff1a;遍历1个大List的过程中&#xff0c;想让断点停在某个特定值 /*** 1、条件断点*/Testpublic void test1() {for (int i 0; i < 10; i) {System.out.println(i);}} 2 异常断点&#xff0c;在程序中出现需要拦截的异常时&#xff0c;会…

Mac 远程 Windows 等桌面操作系统工具 Microsoft Remote Desktop for Mac 下载安装详细使用教程

最近需要在 Mac 上远程连接控制我的 windows 电脑系统&#xff0c;经过一番尝试对于 win 来说还是微软自家推出的 Microsoft Remote Desktop for Mac 最最好用&#xff0c;没有之一 简介 Microsoft Remote Desktop是一款由微软公司开发的远程桌面连接工具&#xff0c;可以让用…

Qt 与 GTK:跨平台 GUI 开发利器,可用Python助力高效GUI编程

在现代软件开发中&#xff0c;图形用户界面 (GUI) 至关重要&#xff0c;它直接影响用户体验和软件的易用性。Qt 和 GTK 作为两种主流的跨平台 GUI 库&#xff0c;为开发者提供了构建精美且功能强大的应用程序的强大工具。本文将深入介绍 Qt 和 GTK 的特性&#xff0c;并探讨如何…