leetcode 1203. 项目管理(拓扑排序)

公司共有 n 个项目和 m 个小组,每个项目要不无人接手,要不就由 m 个小组之一负责。

group[i] 表示第 i 个项目所属的小组,如果这个项目目前无人接手,那么 group[i] 就等于 -1。(项目和小组都是从零开始编号的)小组可能存在没有接手任何项目的情况。

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

同一小组的项目,排序后在列表中彼此相邻。
项目之间存在一定的依赖关系,我们用一个列表 beforeItems 来表示,其中 beforeItems[i] 表示在进行第 i 个项目前(位于第 i 个项目左侧)应该完成的所有项目。
如果存在多个解决方案,只需要返回其中任意一个即可。如果没有合适的解决方案,就请返回一个 空列表 。

示例 1:

输入:n = 8, m = 2, group = [-1,-1,1,0,0,1,0,-1], beforeItems = [[],[6],[5],[6],[3,6],[],[],[]]
输出:[6,3,4,1,5,2,0,7]

代码

class Solution {public int[] sortItems(int n, int m, int[] group, List<List<Integer>> beforeItems) {List<List<Integer>> groupItems=new ArrayList<>();//组-项目的映射List<Integer> groupId=new ArrayList<>();//组的idList<List<Integer>> groupEdges=new ArrayList<>();//组-组的图for(int i=0;i<n+m;i++){groupItems.add(new ArrayList<>());groupId.add(i);groupEdges.add(new ArrayList<>());}List<List<Integer>> itemEdges=new ArrayList<>();//项目-项目int lastGroup=m;for(int j=0;j<n;j++)//构造 组和项目之间的映射关系{itemEdges.add(new ArrayList<>());if(group[j]==-1)//无人接收的项目,放在id序列的最后n个,并且假设其有一个组接收{group[j]=lastGroup;lastGroup++;}groupItems.get(group[j]).add(j);}int[] itemDegree=new int[n];//对于每个项目的入度表int[] groupDegree=new int[m+n];//对于每个组的入度表for(int k=0;k<beforeItems.size();k++)//根据先后关系构造组-组图 以及项目-项目的图{int cur=group[k];for(int j=0;j<beforeItems.get(k).size();j++){int item=beforeItems.get(k).get(j);if(group[item]==cur)//同一个组负责的项目,就加入项目-项目图{itemDegree[k]++;itemEdges.get(item).add(k);}else{//不是同一个组负责的项目,就加入组-组图{groupDegree[cur]++;groupEdges.get(group[item]).add(cur);}}}List<Integer> groupSort=toSort(groupDegree,groupEdges,groupId);//先对组——组图进行拓扑排序if(groupSort.size()==0) return new int[0];List<Integer> ans=new ArrayList<>();for(int c:groupSort)//再对每个组,组内的项目进行拓扑排序{if(groupItems.get(c).size()==0) continue;List<Integer> in=toSort(itemDegree,itemEdges,groupItems.get(c));if(in.size()==0)return new int[0];ans.addAll(in);}return ans.stream().mapToInt(Integer::intValue).toArray();}public  List<Integer> toSort(int[] degree,List<List<Integer>> edges,List<Integer> point){//拓扑排序代码List<Integer> res=new ArrayList<>();Queue<Integer> queue=new LinkedList<>();for(Integer integer:point){if(degree[integer]==0)queue.offer(integer);}while (!queue.isEmpty()){int t=queue.poll();List<Integer> list=edges.get(t);for(int c:list){degree[c]--;if(degree[c]==0)queue.offer(c);}res.add(t);}return res.size()==point.size()?res:new ArrayList<>();}
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

谷歌cloud_通过使用Google Cloud ML大规模提供机器学习模型,我们学到了什么

谷歌cloudby Daitan通过大潭 通过使用Google Cloud ML大规模提供机器学习模型&#xff0c;我们学到了什么 (What we learned by serving machine learning models at scale using Google Cloud ML) By Bruno Schionato, Diego Domingos, Fernando Moraes, Gustavo Rozato, Isa…

php企业黄页源码,PHPCMS 企业黄页模块 v9 GBK 正式版

PHPCMS V9采用OOP(面向对象)方式进行基础运行框架搭建。模块化开发方式做为功能开发形式。框架易于功能扩展&#xff0c;代码维护&#xff0c;优秀的二次开发能力&#xff0c;可满足所有网站的应用需求。PHPCMS V9企业黄页主要特色1、模型自定义&#xff0c;支持模型添加、修改…

跨域配置

SpringBoot跨域配置 我们的后端使用Spring Boot。Spring Boot跨域非常简单&#xff0c;只需书写以下代码即可。 Configuration public class CustomCORSConfiguration {private CorsConfiguration buildConfig() {CorsConfiguration corsConfiguration new CorsConfiguration(…

fromEvent

fromEvent(selector,Event) 实际效果图 这个功能和cad 3dmax里面的鼠标定位功能一致吧&#xff0c;是不是有点小成就&#xff1f; 转载于:https://www.cnblogs.com/xiongwei2017/p/7074180.html

java开发第一天上班_从第一天开始,如何成为一名优秀的团队合作伙伴,成为初级开发人员

java开发第一天上班One of the many things you might be asking yourself when starting your software development career is:在开始软件开发职业时&#xff0c;您可能会问自己很多事情之一&#xff1a; “How do I REALLY contribute to my new team?”“我如何真正为我的…

java虚拟机编译文件,理解Java虚拟机(1)之一个.java文件编译成.class文件发生了什么...

理解Java虚拟机(1)之一个.java文件编译成.class文件发生了什么最近在看《深入理解Java虚拟机》弄明白了很多java的底层知识&#xff0c;决定分几部分总结下&#xff0c;从.java文件编译&#xff0c;到类加载机制&#xff0c;内存分配垃圾回收机制&#xff0c;线程并发&#xff…

leetcode 684. 冗余连接()

在本问题中, 树指的是一个连通且无环的无向图。 输入一个图&#xff0c;该图由一个有着N个节点 (节点值不重复1, 2, …, N) 的树及一条附加的边构成。附加的边的两个顶点包含在1到N中间&#xff0c;这条附加的边不属于树中已存在的边。 结果图是一个以边组成的二维数组。每一…

Go-如何读取yaml,json,ini等配置文件

1. json使用 JSON 应该比较熟悉&#xff0c;它是一种轻量级的数据交换格式。层次结构简洁清晰 &#xff0c;易于阅读和编写&#xff0c;同时也易于机器解析和生成。 创建 conf.json&#xff1a;{"enabled": true,"path": "/usr/local" }新建conf…

SQL转化为MapReduce的过程

转载&#xff1a;http://www.cnblogs.com/yaojingang/p/5446310.html 在了解了MapReduce实现SQL基本操作之后&#xff0c;我们来看看Hive是如何将SQL转化为MapReduce任务的&#xff0c;整个编译过程分为六个阶段&#xff1a; Antlr定义SQL的语法规则&#xff0c;完成SQL词法&am…

使用集合映射和关联关系映射_使用R进行基因ID映射

使用集合映射和关联关系映射Inter-conversion of gene ID’s is the most important aspect enabling genomic and proteomic data analysis. There are multiple tools available each with its own drawbacks. While performing enrichment analysis on Mass Spectrometry da…

leetcode 1018. 可被 5 整除的二进制前缀

给定由若干 0 和 1 组成的数组 A。我们定义 N_i&#xff1a;从 A[0] 到 A[i] 的第 i 个子数组被解释为一个二进制数&#xff08;从最高有效位到最低有效位&#xff09;。 返回布尔值列表 answer&#xff0c;只有当 N_i 可以被 5 整除时&#xff0c;答案 answer[i] 为 true&…

纯java应用搭建,16、BoneCp纯java项目使用

2、代码实现 package com.study;import com.jolbox.bonecp.BoneCP;import com.jolbox.bonecp.BoneCPConfig;import com.jolbox.bonecp.BoneCPDataSource;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.sql.*;/*** Boncp 纯java处理* CreateTime 2018/3/…

数据结构与算法深入学习_我最喜欢的免费课程,用于深入学习数据结构和算法...

数据结构与算法深入学习by javinpaul由javinpaul Data structures and algorithms are some of the most essential topics for programmers, both to get a job and to do well on a job. Good knowledge of data structures and algorithms is the foundation of writing go…

RabbitMQ学习系列(一): 介绍

1、介绍 RabbitMQ是一个由erlang开发的基于AMQP&#xff08;Advanced Message Queue &#xff09;协议的开源实现。用于在分布式系统中存储转发消息&#xff0c;在易用性、扩展性、高可用性等方面都非常的优秀。是当前最主流的消息中间件之一。 RabbitMQ的官网&#xff1a;http…

详尽kmp_详尽的分步指南,用于数据准备

详尽kmp表中的内容 (Table of Content) Introduction 介绍 What is Data Preparation 什么是数据准备 Exploratory Data Analysis (EDA) 探索性数据分析(EDA) Data Preprocessing 数据预处理 Data Splitting 数据分割 介绍 (Introduction) Before we get into this, I want to …

leetcode 947. 移除最多的同行或同列石头(dfs)

n 块石头放置在二维平面中的一些整数坐标点上。每个坐标点上最多只能有一块石头。 如果一块石头的 同行或者同列 上有其他石头存在&#xff0c;那么就可以移除这块石头。 给你一个长度为 n 的数组 stones &#xff0c;其中 stones[i] [xi, yi] 表示第 i 块石头的位置&#x…

matlab距离保护程序,基于MATLAB的距离保护仿真.doc

基于MATLAB的距离保护仿真摘要&#xff1a;本文阐述了如何利用Matlab中的Simulink及SPS工具箱建立线路的距离保护仿真模型&#xff0c;并用S函数编制相间距离保护和接地距离保护算法程序&#xff0c;构建相应的保护模块&#xff0c;实现了三段式距离保护。仿真结果表明&#xf…

ZOJ3385 - Hanami Party (贪心)

题目链接&#xff1a; http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode3385 题目大意&#xff1a; 妖梦要准备一个party&#xff0c;所以需要许多食物&#xff0c;初始化妖梦的烹饪技能为L&#xff0c;每天妖梦有两种选择&#xff0c;一是选择当天做L个食物&am…

sklearn.fit_两个小时后仍在运行吗? 如何控制您的sklearn.fit。

sklearn.fitby Nathan Toubiana内森图比亚纳(Nathan Toubiana) 两个小时后仍在运行吗&#xff1f; 如何控制您的sklearn.fit (Two hours later and still running? How to keep your sklearn.fit under control) Written by Gabriel Lerner and Nathan Toubiana加布里埃尔勒纳…

RabbitMQ学习系列(二): RabbitMQ安装与配置

1&#xff0e;安装 Rabbit MQ 是建立在强大的Erlang OTP平台上&#xff0c;因此安装RabbitMQ之前要先安装Erlang。 erlang&#xff1a;http://www.erlang.org/download.html rabbitmq&#xff1a;http://www.rabbitmq.com/download.html 注意&#xff1a; 1.现在先别装最新的 3…