Skip to content

Commit ac0dd47

Browse files
committed
[Function add]
1. Add leetcode solutions.
1 parent 11ce431 commit ac0dd47

File tree

3 files changed

+114
-1
lines changed

3 files changed

+114
-1
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,8 @@
359359

360360
[206. Reverse Linked List](https://github.com/Seanforfun/Algorithm-and-Leetcode/blob/master/leetcode/206.%20Reverse%20Linked%20List.md)
361361

362+
[207. Course Schedule](https://github.com/Seanforfun/Algorithm-and-Leetcode/blob/master/leetcode/207.%20Course%20Schedule.md)
363+
362364
## Algorithm(4th_Edition)
363365
Reading notes of book Algorithm(4th Algorithm),ISBN: 9787115293800.
364366
All java realization codes are placed in different packages.

leetcode/206. Reverse Linked List.md

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ class Solution {
7070
```
7171

7272
### 二刷
73+
1. 使用迭代法。
7374
```Java
7475
/**
7576
* Definition for singly-linked list.
@@ -92,4 +93,36 @@ class Solution {
9293
return pre;
9394
}
9495
}
96+
```
97+
98+
2. 使用递归法。
99+
```Java
100+
/**
101+
* Definition for singly-linked list.
102+
* public class ListNode {
103+
* int val;
104+
* ListNode next;
105+
* ListNode(int x) { val = x; }
106+
* }
107+
*/
108+
class Solution {
109+
ListNode ret = null;
110+
public ListNode reverseList(ListNode head) {
111+
if(head == null) return head;
112+
ListNode tail = reverseNode(head);
113+
tail.next = null;
114+
return this.ret;
115+
}
116+
117+
private ListNode reverseNode(ListNode node){
118+
if(node.next == null){
119+
this.ret = node;
120+
return node;
121+
}else{
122+
ListNode next = reverseNode(node.next);
123+
next.next = node;
124+
return node;
125+
}
126+
}
127+
}
95128
```

leetcode/207. Course Schedule.md

Lines changed: 79 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,4 +64,82 @@ class Solution {
6464
return count == numCourses;
6565
}
6666
}
67-
```
67+
```
68+
69+
### 二刷
70+
1. Method 1: We can use Khan method to solve this question, which is another version of bfs.
71+
```Java
72+
class Solution {
73+
public boolean canFinish(int numCourses, int[][] prerequisites) {
74+
int[] indegree = new int[numCourses];
75+
Map<Integer, List<Integer>> adj = new HashMap<>();
76+
for(int[] pre : prerequisites){
77+
List<Integer> temp = adj.containsKey(pre[0]) ? adj.get(pre[0]) : new ArrayList<Integer>();
78+
temp.add(pre[1]);
79+
adj.put(pre[0], temp);
80+
indegree[pre[1]]++;
81+
}
82+
LinkedList<Integer> queue = new LinkedList<>();
83+
for(int i = 0; i < numCourses; i++){
84+
if(indegree[i] == 0) queue.add(i);
85+
}
86+
int count = 0;
87+
while(!queue.isEmpty()){
88+
int pre = queue.poll();
89+
count++;
90+
if(adj.containsKey(pre)){
91+
List<Integer> list = adj.get(pre);
92+
for(Integer v : list){
93+
indegree[v]--;
94+
if(indegree[v] == 0)
95+
queue.add(v);
96+
}
97+
}
98+
}
99+
return count == numCourses;
100+
}
101+
}
102+
```
103+
104+
2. Method 2: Use dfs to solve this problem.
105+
```Java
106+
class Solution {
107+
public boolean canFinish(int numCourses, int[][] prerequisites) {
108+
int[] indegree = new int[numCourses];
109+
Map<Integer, List<Integer>> adj = new HashMap<>();
110+
boolean[] visited = new boolean[numCourses];
111+
for(int[] pre : prerequisites){
112+
indegree[pre[1]]++;
113+
List<Integer> temp = adj.containsKey(pre[0]) ? adj.get(pre[0]): new ArrayList<>();
114+
temp.add(pre[1]);
115+
adj.put(pre[0], temp);
116+
}
117+
boolean containsZero = false;
118+
for(int i = 0; i < numCourses; i++){
119+
if(indegree[i] == 0 && !visited[i]){
120+
containsZero = true;
121+
dfs(i, indegree, visited, adj);
122+
}
123+
}
124+
if(!containsZero) return false;
125+
for(boolean visit : visited){
126+
if(!visit) return false;
127+
}
128+
return true;
129+
}
130+
private void dfs(int cur, int[] indegree, boolean[] visited, Map<Integer, List<Integer>> adj){
131+
visited[cur] = true;
132+
if(adj.containsKey(cur)){
133+
for(Integer next : adj.get(cur)){
134+
indegree[next]--;
135+
if(indegree[next] == 0 && !visited[next]){
136+
dfs(next, indegree, visited, adj);
137+
}
138+
}
139+
}
140+
}
141+
}
142+
```
143+
144+
### Reference
145+
1. [【图论】有向无环图的拓扑排序](https://www.cnblogs.com/en-heng/p/5085690.html)

0 commit comments

Comments
 (0)