leetcode:1203. 项目管理【双topo:组间topo + 组内topo】
创始人
2024-03-23 06:06:27

目录

  • 题目截图
  • 题目分析
  • ac code
  • 总结

题目截图

在这里插入图片描述

题目分析

  • 没有第一个条件,就是简单topo排序
  • 有了第一个条件,每个小组都需要完全隔开,因此不同小组间也需要一个topo排
  • step1:对于group为-1的自成一组
  • step2:建图,组内以及组间,对于beforeItems的关系,通过groupId判断是组间还是组内
  • step3:topo check函数
  • step4:先判断组间能否完成topo,记录inter_topo顺序
  • step5:按照inter_topo再各自判断inner_topo,如果全部inner_topo都合法,合成whole_topo即可

ac code

class Solution:def sortItems(self, n: int, m: int, group: List[int], beforeItems: List[List[int]]) -> List[int]:# 同一小组的项目,排序后在列表中彼此相邻 -> 组间topo# 全局topo = 组间topo + 组内topo# step1: 补充分组信息groupIndex2groupMember = defaultdict(list)for i in range(n):if group[i] == -1:group[i] = mm += 1groupIndex2groupMember[group[i]].append(i)# step2: 组间和组内建图inter = defaultdict(list)inner = defaultdict(lambda: defaultdict(list))for i in range(n):for j in beforeItems[i]:# j -> iif group[i] == group[j]: # 组内inner[group[i]][j].append(i)else: # 组间inter[group[j]].append(group[i])# step3: topo排序checkdef check_topo(g, nodes):indeg = defaultdict(int)for x in g:for y in g[x]: # y入度+1indeg[y] += 1q = [i for i in nodes if indeg[i] == 0]topo_ans = q[:]while q:new_q = []for qq in q:for next_node in g[qq]:indeg[next_node] -= 1if indeg[next_node] == 0:topo_ans.append(next_node)new_q.append(next_node)q = new_q#print(topo_ans)return topo_ans if len(topo_ans) == len(nodes) else []# step4: 组间checkinter_topo = check_topo(inter, list(set(group))) # 不能用range(m), 可能中间有空位if len(inter_topo) == 0:return []# step5: 组内check, 逐一checkwhole_topo = []for idx in inter_topo: # 按照inter_topo取出group的idx#print(idx, inner[idx], groupIndex2groupMember[idx])inner_topo = check_topo(inner[idx], groupIndex2groupMember[idx])#print(inner_topo)if len(inner_topo) == 0:return []whole_topo.extend(inner_topo)return whole_topo

总结

  • 学到了一个二维defaultdict的写法:
    • inner = defaultdict(lambda: defaultdict(list))
  • 组间组内topo,关键是通过同组要连续放,想到组间topo
  • 然后组内topo就很自然了

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...