Skip to content

Commit 5c467d5

Browse files
committed
20190108
1 parent e250313 commit 5c467d5

File tree

3 files changed

+189
-0
lines changed

3 files changed

+189
-0
lines changed

code/lc207.java

+92
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
package code;
2+
3+
import java.util.*;
4+
5+
/*
6+
* 207. Course Schedule
7+
* 题意:课程是否能够完成
8+
* 难度:Medium
9+
* 分类:Depth-first Search, Breadth-first Search, Graph, Topology Sort
10+
* 思路:两种方法,一种BFS拓扑排序,另一种DFS找是否有环
11+
* Tips:很经典的题,拓扑排序,判断图是否有环的DFS
12+
*/
13+
public class lc207 {
14+
public static void main(String[] args) {
15+
int[][] prerequisites = {{1,0},{0,1}};
16+
//System.out.println(canFinish(2, prerequisites));
17+
System.out.println(canFinish2(2, prerequisites));
18+
}
19+
public static boolean canFinish(int numCourses, int[][] prerequisites) {
20+
int[] indegree = new int[numCourses];
21+
int[][] graph = new int[numCourses][numCourses];
22+
for (int i = 0; i < prerequisites.length ; i++) {
23+
int node1 = prerequisites[i][0];
24+
int node2 = prerequisites[i][1];
25+
graph[node2][node1] = 1;
26+
indegree[node1]++; //存下入度,入度为0时,表示该课程可以修
27+
}
28+
Stack<Integer> st = new Stack();
29+
int count = 0;
30+
for (int i = 0; i < numCourses ; i++) {
31+
if(indegree[i]==0) {
32+
st.add(i);
33+
count++;
34+
}
35+
}
36+
while(!st.isEmpty()){
37+
int node = st.pop();
38+
for (int i = 0; i < numCourses ; i++) {
39+
if(graph[node][i]==1) {
40+
indegree[i]--;
41+
if(indegree[i]==0){
42+
st.add(i);
43+
count++;
44+
}
45+
}
46+
}
47+
}
48+
return count==numCourses; //可以修的课程==课程数
49+
}
50+
51+
public static boolean canFinish2(int numCourses, int[][] prerequisites) {
52+
HashMap<Integer, LinkedList<Integer>> graph = new HashMap<>();
53+
// 转换成连接表
54+
for (int i = 0; i < prerequisites.length ; i++) {
55+
int node1 = prerequisites[i][0];
56+
int node2 = prerequisites[i][1];
57+
if(graph.containsKey(node1)){
58+
graph.get(node1).add(node2);
59+
}else{
60+
LinkedList l = new LinkedList<>();
61+
l.add(node2);
62+
graph.put(node1, l);
63+
}
64+
}
65+
66+
Set<Integer> visited = new HashSet(); //记录没有环的节点
67+
for (int i = 0; i < numCourses ; i++) {
68+
Set<Integer> onpath = new HashSet(); //路径上的节点,要声明在里边,换节课后就清空了
69+
if(hascycle(i,graph,onpath,visited))//有环
70+
return false;
71+
}
72+
return true;
73+
}
74+
public static boolean hascycle(int course, HashMap graph, Set<Integer> onpath, Set<Integer> visited){
75+
if( visited.contains(course)) //如果该节点之前判断过了没有环
76+
return false;
77+
if( onpath.contains(course))
78+
return true;
79+
onpath.add(course); //没有回溯了,自顶向下的,不用remove
80+
LinkedList<Integer> nodes = (LinkedList<Integer>)graph.get(course);
81+
if(nodes==null)
82+
return false;
83+
for (int i = 0; i < nodes.size() ; i++) {
84+
if(!hascycle(nodes.get(i), graph, onpath, visited))
85+
visited.add(nodes.get(i));
86+
else
87+
return true;
88+
}
89+
onpath.remove((Integer)course);
90+
return false;
91+
}
92+
}

code/lc208.java

+61
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package code;
2+
/*
3+
* 208. Implement Trie (Prefix Tree)
4+
* 题意:字典树
5+
* 难度:Medium
6+
* 分类:Design, Trie
7+
* 思路:字典树是一个数据结构,这个数据结构里包含很多TrieNode,每个TireNode都用一个长度为26的TrieNode[]数组表示该字符的下一个字符对象
8+
* Tips:
9+
*/
10+
public class lc208 {
11+
class TrieNode {
12+
public char val;
13+
public boolean isWord;
14+
public TrieNode[] children = new TrieNode[26];
15+
public TrieNode() {}
16+
TrieNode(char c){
17+
TrieNode node = new TrieNode();
18+
node.val = c;
19+
}
20+
}
21+
22+
public class Trie {
23+
private TrieNode root;
24+
public Trie() {
25+
root = new TrieNode();
26+
root.val = ' ';
27+
}
28+
29+
public void insert(String word) {
30+
TrieNode ws = root;
31+
for(int i = 0; i < word.length(); i++){
32+
char c = word.charAt(i);
33+
if(ws.children[c - 'a'] == null){
34+
ws.children[c - 'a'] = new TrieNode(c);
35+
}
36+
ws = ws.children[c - 'a'];
37+
}
38+
ws.isWord = true;
39+
}
40+
41+
public boolean search(String word) {
42+
TrieNode ws = root;
43+
for(int i = 0; i < word.length(); i++){
44+
char c = word.charAt(i);
45+
if(ws.children[c - 'a'] == null) return false;
46+
ws = ws.children[c - 'a'];
47+
}
48+
return ws.isWord;
49+
}
50+
51+
public boolean startsWith(String prefix) {
52+
TrieNode ws = root;
53+
for(int i = 0; i < prefix.length(); i++){
54+
char c = prefix.charAt(i);
55+
if(ws.children[c - 'a'] == null) return false;
56+
ws = ws.children[c - 'a'];
57+
}
58+
return true;
59+
}
60+
}
61+
}

code/lc221.java

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package code;
2+
/*
3+
* 221. Maximal Square
4+
* 题意:0,1数组中最大正方形
5+
* 难度:Medium
6+
* 分类:Dynamic Programming
7+
* 思路:三个正方形+上右下角位置,可以组成一个新的正方形
8+
* Tips:和lc85作比较
9+
*/
10+
public class lc221 {
11+
public static void main(String[] args) {
12+
char[][] matrix = {{'1','0','1','0','0'},{'1','0','1','1','1'},{'1','1','1','1','1'},{'1','0','0','1','0'}};
13+
System.out.println(maximalSquare(matrix));
14+
}
15+
public static int maximalSquare(char[][] matrix) {
16+
if(matrix.length==0)
17+
return 0;
18+
int[][] dp = new int[matrix.length][matrix[0].length];
19+
int max = 0;
20+
for (int i = 0; i < matrix.length ; i++) {
21+
for (int j = 0; j < matrix[0].length ; j++) {
22+
if(i==0 || j==0) {
23+
dp[i][j] = matrix[i][j]-'0';
24+
max = Math.max(dp[i][j],max);
25+
}
26+
else{
27+
if(matrix[i][j]=='1') {
28+
dp[i][j] = Math.min(Math.min(dp[i - 1][j], dp[i][j - 1]), dp[i - 1][j - 1]) + 1; //dp[i][j] 最大正方形边长
29+
max = Math.max(dp[i][j], max);
30+
}
31+
}
32+
}
33+
}
34+
return max*max;
35+
}
36+
}

0 commit comments

Comments
 (0)