【道德经·第三十二章】道常无名,朴。虽小,天下莫能臣。候王若能守之,万物将自宾。天地相合,以降甘露,民莫之令而自均。
给一个数组 prerequisites,返回你为了学完所有课程所安排的学习顺序。
示例 1:
1 2
   | 输入: numCourses = 2, prerequisites = [[1,0]]  输出: [0,1]
   | 
 
示例 2:
1 2
   | 输入: numCourses = 4, prerequisites = [[1,0],[2,0],[3,1],[3,2]] 输出: [0,1,2,3] or [0,2,1,3]
   | 
 
示例 3:
1 2 3
   | 输入: numCourses = 1, prerequisites = []  输出: [0] 解释: 总共 1 门课,直接修第一门课就可。
   | 
 
实现代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
   | class Solution { public:     vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {         unordered_map<int, vector<int> > graph;         vector<int> inDegrees(numCourses, 0);                  for(auto& pre : prerequisites) {             graph[pre[1]].push_back(pre[0]);             inDegrees[pre[0]]++;         }                  queue<int> q;         for(int i = 0; i < numCourses; i++) {             if(inDegrees[i] == 0) {                 q.push(i);             }         }                  vector<int> res;         while(!q.empty()) {             int node = q.front();             q.pop();                          res.push_back(node);             for(int n : graph[node]) {                 inDegrees[n]--;                                  if(inDegrees[n] == 0) {                     q.push(n);                 }             }         }                  if(res.size() != numCourses) {             return {};         }                  return res;     } };
  | 
 
根据词典还原出此语言中已知的字母顺序,并按字母递增顺序排列。
示例 1:
1 2
   | 输入:words = ["wrt","wrf","er","ett","rftt"] 输出:"wertf"
   | 
 
示例 2:
1 2
   | 输入:words = ["z","x"] 输出:"zx"
   | 
 
示例 3:
1 2 3
   | 输入:words = ["z","x","z"] 输出:"" 解释:不存在合法字母顺序,因此返回 "" 。
   | 
 
实现代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
   | class Solution { public:     string alienOrder(vector<string>& words) {         unordered_map<char, unordered_set<char> > graph;         unordered_map<char, int> inDegrees;                  for(auto& word : words) {             for(char c : word) {                 if(!graph.count(c)) {                     graph[c] = {};                 }                                  if(!inDegrees.count(c)) {                     inDegrees[c] = 0;                 }             }         }                  for(int i = 1; i < words.size(); i++) {             int j = 0;             int minlen = min(words[i-1].size(), words[i].size());             for(; j < minlen; j++) {                 char c1 = words[i-1][j];                 char c2 = words[i][j];                 if(c1 != c2) {                     if(!graph[c1].count(c2)) {                         graph[c1].insert(c2);                         inDegrees[c2]++;                     }                                          break;                 }             }                          if(j==minlen && words[i-1].size()>words[i].size()) {                 return {};             }         }                  string res;         queue<char> q;         for(auto& d : inDegrees) {             if(d.second == 0) {                 q.push(d.first);             }         }                  while(!q.empty()) {             char c = q.front();             q.pop();                          res.push_back(c);             for(auto& c : graph[c]) {                 inDegrees[c]--;                                  if(inDegrees[c] == 0) {                     q.push(c);                 }             }         }                  if(res.size() != inDegrees.size()) {             return "";         }                  return res;     } };
  | 
 
请判断原始的序列 org 是否可以从序列集 seqs 中唯一地 重建 。
示例 1:
1 2 3
   | 输入: org = [1,2,3], seqs = [[1,2],[1,3]] 输出: false 解释:[1,2,3] 不是可以被重建的唯一的序列,因为 [1,3,2] 也是一个合法的序列。
   | 
 
示例 2:
1 2 3
   | 输入: org = [1,2,3], seqs = [[1,2]] 输出: false 解释:可以重建的序列只有 [1,2]。
   | 
 
示例 3:
1 2 3
   | 输入: org = [1,2,3], seqs = [[1,2],[1,3],[2,3]] 输出: true 解释:序列 [1,2], [1,3] 和 [2,3] 可以被唯一地重建为原始的序列 [1,2,3]。
   | 
 
实现代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
   | class Solution { public:     bool sequenceReconstruction(vector<int>& org, vector<vector<int>>& seqs) {         unordered_map<int, unordered_set<int> > graph;         vector<int> inDegrees(org.size()+1, -1);         for(auto& seq : seqs) {             for(int& num : seq) {                 if(num<1 || num>org.size()) {                     return false;                 }                                  if(!graph.count(num)) {                     graph[num] = {};                 }                                  if(inDegrees[num] == -1) {                     inDegrees[num] = 0;                 }             }                          for(int i = 0; i < seq.size()-1; i++) {                 int num1 = seq[i];                 int num2 = seq[i+1];                                  if(!graph[num1].count(num2)) {                     graph[num1].insert(num2);                     inDegrees[num2]++;                 }             }         }                  queue<int> q;         int index = 0;         for(int i = 1; i < inDegrees.size(); i++) {             if(inDegrees[i] == 0) {                 if(q.size()==0 && org[index++]==i) {                     q.push(i);                 } else {                     return false;                 }             }         }                  while(!q.empty()) {             int node  = q.front(); q.pop();             for(auto& next : graph[node]) {                 inDegrees[next]--;                                  if(inDegrees[next] == 0) {                     if(q.size()==0 && org[index++]==next) {                         q.push(next);                     } else {                         return false;                     }                 }             }         }                  return index==org.size();     } };
  | 
 
位我上者,灿烂星空;道德律令,在我心中。