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.pswp.cn/news/392329.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/392329.shtml
英文地址,請注明出處:http://en.pswp.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…