-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path207_javascript.js
More file actions
134 lines (110 loc) · 3.34 KB
/
207_javascript.js
File metadata and controls
134 lines (110 loc) · 3.34 KB
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
// 你这个学期必须选修 numCourse 门课程,记为 0 到 numCourse-1 。
// 在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们:[0,1]
// 给定课程总量以及它们的先决条件,请你判断是否可能完成所有课程的学习?
// 示例 1:
// 输入: 2, [[1,0]]
// 输出: true
// 解释: 总共有 2 门课程。学习课程 1 之前,你需要完成课程 0。所以这是可能的。
// 示例 2:
// 输入: 2, [[1,0],[0,1]]
// 输出: false
// 解释: 总共有 2 门课程。学习课程 1 之前,你需要先完成课程 0;并且学习课程 0 之前,你还应先完成课程 1。这是不可能的。
// 提示:
/**
* @param {number} numCourses
* @param {number[][]} prerequisites
* @return {boolean}
*/
// [[4,0],[4,1],[5,3],[5,2],[6,4],[6,5]]
// tempArr = [0,0,0,0,2,2,2]
// {
// 0 : [4],
// 1 : [4],
// 2 : [5],
// 3 : [5],
// 4 : [6],
// 5 : [6]
// }
var canFinish = function(numCourses, prerequisites) {
let map = {};
let tempArr = new Array(numCourses).fill(0);
for(let i=0; i<prerequisites.length; i++){
tempArr[prerequisites[i][0]] ++
if(map[prerequisites[i][1]]){
map[prerequisites[i][1]].push(prerequisites[i][0])
}else {
map[prerequisites[i][1]] = [prerequisites[i][0]]
}
}
let queue = [];
for(let i=0; i<tempArr.length;i++){
if(tempArr[i] == 0){
queue.push(i)
}
}
let count = 0;
while(queue.length){
// 推出一个能修的课程
let temp = queue.shift();
// 修掉的课程数++
count ++;
// 获取这个课程的父级课程
let mapArr = map[temp];
if(mapArr && mapArr.length){
for(let i = 0; i < mapArr.length; i++){
// 所有父级课程所需的子选修课程数量-1
tempArr[mapArr[i]] --;
// =0 时表示父级课程可以选修 push进数组
if(tempArr[mapArr[i]] == 0){
queue.push(mapArr[i])
}
}
}
}
return count == numCourses
};
// DFS
/**
* @param {number} numCourses
* @param {number[][]} prerequisites
* @return {boolean}
*/
var canFinish = function(numCourses, prerequisites) {
let visited = new Array(numCourses).fill(0);
let map = {}
for(let i=0; i<prerequisites.length; i++){
if(map[prerequisites[i][1]]){
map[prerequisites[i][1]].push(prerequisites[i][0])
}else {
map[prerequisites[i][1]] = [prerequisites[i][0]]
}
}
let dfs = (node) =>{
// 1 表示此次循环中 经过节点 即存在环
if(visited[node] == 1){
return true
}
// -1 表示已结束
if(visited[node] == -1){
return false;
}
visited[node] = 1
if(map[node]){
for(let i=0; i<map[node].length; i++){
if(dfs(map[node][i])){
// 当下层返回true 是即有环 退出递归
return true
}
}
}
visited[node] = -1
return false;
}
for(let j=0; j<numCourses; j++){
if(dfs(j)){
// 递归结果有环是 返回false
return false;
}
}
return true;
};