From 14c2c7b4fa8be4cfa7213823e7679b7390c968d0 Mon Sep 17 00:00:00 2001 From: yennanliu Date: Mon, 10 Jun 2024 18:24:00 +0800 Subject: [PATCH] update 323 java, progress --- README.md | 2 +- data/progress.txt | 2 +- data/to_review.txt | 18 ++--- ...rOfConnectedComponentsUndirectedGraph.java | 79 ++++++++++++++++--- 4 files changed, 79 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 17bdac3a..b3843aa0 100644 --- a/README.md +++ b/README.md @@ -1128,7 +1128,7 @@ | # | Title | Solution | Time | Space | Difficulty | Status | Note| |-----|---------------- | --------------- | --------------- | --------------- | ------------- |--------------|-----| 269 |[Alien Dictionary](https://leetcode.com/problems/alien-dictionary/) | [Python](./leetcode_python/Graph/alien-dictionary.py), [Java](./leetcode_java/src/main/java/LeetCodeJava/Graph/AlienDictionary.java) | | | Hard| Curated Top 75, dfs, bfs, topology sort, `fb`, google, m$, airbnb, uber, amazon | AGAIN******** (4) (not start) -323| [Number of Connected Components in an Undirected Graph](https://leetcode.com/problems/number-of-connected-components-in-an-undirected-graph/) | [Python ](./leetcode_python/Graph/number-of-connected-components-in-an-undirected-graph.py), [Java ](./leetcode_java/src/main/java/LeetCodeJava/Graph/NumberOfConnectedComponentsUndirectedGraph.java) | _O(n)_ | _O(n)_| Medium | Curated Top 75, 🔒 , dfs, Union Find, `graph`, `linkedin`, `amazon`, fb, google, m$, linkedin| AGAIN************** (5) (MUST) +323| [Number of Connected Components in an Undirected Graph](https://leetcode.com/problems/number-of-connected-components-in-an-undirected-graph/) | [Python ](./leetcode_python/Graph/number-of-connected-components-in-an-undirected-graph.py), [Java ](./leetcode_java/src/main/java/LeetCodeJava/Graph/NumberOfConnectedComponentsUndirectedGraph.java) | _O(n)_ | _O(n)_| Medium | Curated Top 75, LC 547, 🔒 , dfs, Union Find, `graph`, `linkedin`, `amazon`, fb, google, m$, linkedin| AGAIN************** (5) (MUST) 959 | [Regions Cut By Slashes](https://leetcode.com/problems/regions-cut-by-slashes/) | [Python](./leetcode_python/Graph/regions-cut-by-slashes.py) | _O(n^2)_| _O(n^2)_| Medium | Union Find | 1135 | [Connecting Cities With Minimum Cost](https://leetcode.com/problems/connecting-cities-with-minimum-cost/) | [Python](./leetcode_python/Graph/connecting-cities-with-minimum-cost.py) | _O(n^2)_| _O(n^2)_| Medium | union find, Kruskal, prime, graph, amazon | AGAIN (not start) diff --git a/data/progress.txt b/data/progress.txt index c3983786..9cf35591 100644 --- a/data/progress.txt +++ b/data/progress.txt @@ -1,4 +1,4 @@ -20240610: 22(ok*),207(ok*),210(todo),323(again) +20240610: 22(ok*),207(ok*),210(todo),323(again),547(todo) 20240609: 236(again*),1448(again),needcode_trie,208(ok*),needcode_graph,695,22(todo),981(todo),261(todo) 20240608: 503(todo),739(ok),105(todo),needcode_heap_pq,1046,215,needcode_backtrack,78,39(todo),46,90(todo),77 20240607: 235(ok),236(again),496(ok),110(ok),1448(again!) diff --git a/data/to_review.txt b/data/to_review.txt index ed783009..4417c9fb 100644 --- a/data/to_review.txt +++ b/data/to_review.txt @@ -1,4 +1,4 @@ -2024-08-04 -> ['22(ok*),207(ok*),210(todo),323(again)'] +2024-08-04 -> ['22(ok*),207(ok*),210(todo),323(again),547(todo)'] 2024-08-03 -> ['236(again*),1448(again),needcode_trie,208(ok*),needcode_graph,695,22(todo),981(todo),261(todo)'] 2024-08-02 -> ['503(todo),739(ok),105(todo),needcode_heap_pq,1046,215,needcode_backtrack,78,39(todo),46,90(todo),77'] 2024-08-01 -> ['235(ok),236(again),496(ok),110(ok),1448(again!)'] @@ -18,7 +18,7 @@ 2024-07-17 -> ['56'] 2024-07-16 -> ['62,572,57'] 2024-07-15 -> ['322,191,190'] -2024-07-14 -> ['22(ok*),207(ok*),210(todo),323(again)', '73,200,70,323(again)'] +2024-07-14 -> ['22(ok*),207(ok*),210(todo),323(again),547(todo)', '73,200,70,323(again)'] 2024-07-13 -> ['236(again*),1448(again),needcode_trie,208(ok*),needcode_graph,695,22(todo),981(todo),261(todo)', '207,79,206,213,198'] 2024-07-12 -> ['503(todo),739(ok),105(todo),needcode_heap_pq,1046,215,needcode_backtrack,78,39(todo),46,90(todo),77', '212(todo),211,338,208(again)'] 2024-07-11 -> ['235(ok),236(again),496(ok),110(ok),1448(again!)', '347,253(todo),91(todo),217'] @@ -30,7 +30,7 @@ 2024-07-05 -> ['128,261', '121,252'] 2024-07-04 -> ['005,003(again)', '125'] 2024-07-02 -> ['11,647,261(again),133(again)'] -2024-07-01 -> ['22(ok*),207(ok*),210(todo),323(again)', '143,15,268,141,139'] +2024-07-01 -> ['22(ok*),207(ok*),210(todo),323(again),547(todo)', '143,15,268,141,139'] 2024-06-30 -> ['236(again*),1448(again),needcode_trie,208(ok*),needcode_graph,695,22(todo),981(todo),261(todo)', '21,20,19,271,269'] 2024-06-29 -> ['503(todo),739(ok),105(todo),needcode_heap_pq,1046,215,needcode_backtrack,78,39(todo),46,90(todo),77', '417(again),33,153,152'] 2024-06-28 -> ['235(ok),236(again),496(ok),110(ok),1448(again!)', '424,297(todo),295(todo),39'] @@ -38,19 +38,19 @@ 2024-06-26 -> ['150,22(again),739(again!!!),needcode_linkedlist', '56'] 2024-06-25 -> ['567(todo),needcode_array_hash,needcode_sliding_window,567(again),needcode_stack,155(again)', '62,572,57'] 2024-06-24 -> ['146,460,582(ok*),139(ok),322(todo)', '322,191,190'] -2024-06-23 -> ['22(ok*),207(ok*),210(todo),323(again)', '127,742(again),133(again),207(ok*),261(ok)', '73,200,70,323(again)'] +2024-06-23 -> ['22(ok*),207(ok*),210(todo),323(again),547(todo)', '127,742(again),133(again),207(ok*),261(ok)', '73,200,70,323(again)'] 2024-06-22 -> ['236(again*),1448(again),needcode_trie,208(ok*),needcode_graph,695,22(todo),981(todo),261(todo)', '128,261', '207,79,206,213,198'] 2024-06-21 -> ['503(todo),739(ok),105(todo),needcode_heap_pq,1046,215,needcode_backtrack,78,39(todo),46,90(todo),77', '005,003(again)', '212(todo),211,338,208(again)'] 2024-06-20 -> ['235(ok),236(again),496(ok),110(ok),1448(again!)', '347,253(todo),91(todo),217'] 2024-06-19 -> ['206,143,138(again),141,needcode_tree,226,104,110(again!!!)', '11,647,261(again),133(again)', '226,98,253(todo)'] -2024-06-18 -> ['22(ok*),207(ok*),210(todo),323(again)', '150,22(again),739(again!!!),needcode_linkedlist', '143,15,268,141,139', '104,230,102,100'] +2024-06-18 -> ['22(ok*),207(ok*),210(todo),323(again),547(todo)', '150,22(again),739(again!!!),needcode_linkedlist', '143,15,268,141,139', '104,230,102,100'] 2024-06-17 -> ['236(again*),1448(again),needcode_trie,208(ok*),needcode_graph,695,22(todo),981(todo),261(todo)', '567(todo),needcode_array_hash,needcode_sliding_window,567(again),needcode_stack,155(again)', '21,20,19,271,269', '105,106'] 2024-06-16 -> ['503(todo),739(ok),105(todo),needcode_heap_pq,1046,215,needcode_backtrack,78,39(todo),46,90(todo),77', '146,460,582(ok*),139(ok),322(todo)', '417(again),33,153,152', '242,235'] -2024-06-15 -> ['22(ok*),207(ok*),210(todo),323(again)', '235(ok),236(again),496(ok),110(ok),1448(again!)', '127,742(again),133(again),207(ok*),261(ok)', '424,297(todo),295(todo),39', '371'] +2024-06-15 -> ['22(ok*),207(ok*),210(todo),323(again),547(todo)', '235(ok),236(again),496(ok),110(ok),1448(again!)', '127,742(again),133(again),207(ok*),261(ok)', '424,297(todo),295(todo),39', '371'] 2024-06-14 -> ['236(again*),1448(again),needcode_trie,208(ok*),needcode_graph,695,22(todo),981(todo),261(todo)', '206,143,138(again),141,needcode_tree,226,104,110(again!!!)', '128,261', '55,54(todo),53(again),435(again),49,48(todo),300(again)', '121,252'] -2024-06-13 -> ['22(ok*),207(ok*),210(todo),323(again)', '503(todo),739(ok),105(todo),needcode_heap_pq,1046,215,needcode_backtrack,78,39(todo),46,90(todo),77', '150,22(again),739(again!!!),needcode_linkedlist', '005,003(again)', '56', '125'] -2024-06-12 -> ['22(ok*),207(ok*),210(todo),323(again)', '236(again*),1448(again),needcode_trie,208(ok*),needcode_graph,695,22(todo),981(todo),261(todo)', '235(ok),236(again),496(ok),110(ok),1448(again!)', '567(todo),needcode_array_hash,needcode_sliding_window,567(again),needcode_stack,155(again)', '62,572,57'] -2024-06-11 -> ['22(ok*),207(ok*),210(todo),323(again)', '236(again*),1448(again),needcode_trie,208(ok*),needcode_graph,695,22(todo),981(todo),261(todo)', '503(todo),739(ok),105(todo),needcode_heap_pq,1046,215,needcode_backtrack,78,39(todo),46,90(todo),77', '206,143,138(again),141,needcode_tree,226,104,110(again!!!)', '146,460,582(ok*),139(ok),322(todo)', '11,647,261(again),133(again)', '322,191,190'] +2024-06-13 -> ['22(ok*),207(ok*),210(todo),323(again),547(todo)', '503(todo),739(ok),105(todo),needcode_heap_pq,1046,215,needcode_backtrack,78,39(todo),46,90(todo),77', '150,22(again),739(again!!!),needcode_linkedlist', '005,003(again)', '56', '125'] +2024-06-12 -> ['22(ok*),207(ok*),210(todo),323(again),547(todo)', '236(again*),1448(again),needcode_trie,208(ok*),needcode_graph,695,22(todo),981(todo),261(todo)', '235(ok),236(again),496(ok),110(ok),1448(again!)', '567(todo),needcode_array_hash,needcode_sliding_window,567(again),needcode_stack,155(again)', '62,572,57'] +2024-06-11 -> ['22(ok*),207(ok*),210(todo),323(again),547(todo)', '236(again*),1448(again),needcode_trie,208(ok*),needcode_graph,695,22(todo),981(todo),261(todo)', '503(todo),739(ok),105(todo),needcode_heap_pq,1046,215,needcode_backtrack,78,39(todo),46,90(todo),77', '206,143,138(again),141,needcode_tree,226,104,110(again!!!)', '146,460,582(ok*),139(ok),322(todo)', '11,647,261(again),133(again)', '322,191,190'] 2024-06-10 -> ['236(again*),1448(again),needcode_trie,208(ok*),needcode_graph,695,22(todo),981(todo),261(todo)', '503(todo),739(ok),105(todo),needcode_heap_pq,1046,215,needcode_backtrack,78,39(todo),46,90(todo),77', '235(ok),236(again),496(ok),110(ok),1448(again!)', '150,22(again),739(again!!!),needcode_linkedlist', '127,742(again),133(again),207(ok*),261(ok)', '143,15,268,141,139', '73,200,70,323(again)'] 2024-06-09 -> ['503(todo),739(ok),105(todo),needcode_heap_pq,1046,215,needcode_backtrack,78,39(todo),46,90(todo),77', '235(ok),236(again),496(ok),110(ok),1448(again!)', '206,143,138(again),141,needcode_tree,226,104,110(again!!!)', '567(todo),needcode_array_hash,needcode_sliding_window,567(again),needcode_stack,155(again)', '128,261', '21,20,19,271,269', '207,79,206,213,198'] 2024-06-08 -> ['235(ok),236(again),496(ok),110(ok),1448(again!)', '206,143,138(again),141,needcode_tree,226,104,110(again!!!)', '150,22(again),739(again!!!),needcode_linkedlist', '146,460,582(ok*),139(ok),322(todo)', '005,003(again)', '417(again),33,153,152', '212(todo),211,338,208(again)'] diff --git a/leetcode_java/src/main/java/LeetCodeJava/Graph/NumberOfConnectedComponentsUndirectedGraph.java b/leetcode_java/src/main/java/LeetCodeJava/Graph/NumberOfConnectedComponentsUndirectedGraph.java index 8a422e71..bad58a55 100644 --- a/leetcode_java/src/main/java/LeetCodeJava/Graph/NumberOfConnectedComponentsUndirectedGraph.java +++ b/leetcode_java/src/main/java/LeetCodeJava/Graph/NumberOfConnectedComponentsUndirectedGraph.java @@ -9,13 +9,70 @@ public class NumberOfConnectedComponentsUndirectedGraph { // V0 - // IDEA : GRAPH + // IDEA : UNION FIND // TODO : implement it + // https://www.youtube.com/watch?v=8f1XPm4WOUc // public int countComponents(int n, int[][] edges) { // return 0; // } - // V0 + // V1 + // IDEA : UNION FIND + // https://github.com/neetcode-gh/leetcode/blob/main/java/0323-number-of-connected-components-in-an-undirected-graph.java + // https://www.youtube.com/watch?v=8f1XPm4WOUc + private int[] parent; + private int[] rank; + + public int countComponents_1(int n, int[][] edges) { + parent = new int[n]; + rank = new int[n]; + + for (int i = 0; i < n; i++) { + parent[i] = i; + rank[i] = 1; + } + + int result = n; + for (int i = 0; i < edges.length; i++) { + if (union_1(edges[i][0], edges[i][1]) == 1) { + result--; + } + } + + return result; + } + + private int find_1(int node) { + int result = node; + + while (parent[result] != result) { + parent[result] = parent[parent[result]]; + result = parent[result]; + } + + return result; + } + + private int union_1(int n1, int n2) { + int p1 = this.find_1(n1); + int p2 = this.find_1(n2); + + if (p1 == p2) { + return 0; + } + + if (rank[p2] > rank[p1]) { + parent[p1] = p2; + rank[p2] += rank[p1]; + } else { + parent[p2] = p1; + rank[p1] += rank[p2]; + } + + return 1; + } + + // V1 // IDEA : UNION FIND (gpt) // TODO : validate static class UnionFind { @@ -67,7 +124,7 @@ public int getCount() { } } - public int countComponents_0_1(int n, int[][] edges) { + public int countComponents_1_1(int n, int[][] edges) { UnionFind uf = new UnionFind(n); for (int[] edge : edges) { @@ -78,12 +135,12 @@ public int countComponents_0_1(int n, int[][] edges) { } - // V1 + // V2 // IDEA : UNION FIND // https://leetcode.ca/2016-10-18-323-Number-of-Connected-Components-in-an-Undirected-Graph/ private int[] p; - public int countComponents_1(int n, int[][] edges) { + public int countComponents_2(int n, int[][] edges) { p = new int[n]; for (int i = 0; i < n; ++i) { p[i] = i; @@ -108,10 +165,10 @@ private int find(int x) { return p[x]; } - // V2 + // V3 // IDEA : DFS // https://www.cnblogs.com/cnoodle/p/14197652.html - public int countComponents_2(int n, int[][] edges) { + public int countComponents_3(int n, int[][] edges) { int count = 0; List> g = new ArrayList<>(); boolean[] visited = new boolean[n]; @@ -141,10 +198,10 @@ private void dfs(boolean[] visited, int node, List> g) { } } - // V3 + // V4 // IDEA : UNION FIND // https://www.cnblogs.com/cnoodle/p/14197652.html - public int countComponents_3(int n, int[][] edges) { + public int countComponents_4(int n, int[][] edges) { int count = n; int[] parents = new int[n]; for (int i = 0; i < n; i++) { @@ -169,10 +226,10 @@ private int find(int[] parents, int i) { return i; } - // V4 + // V5 // IDEA : BFS // https://www.cnblogs.com/cnoodle/p/14197652.html - public int countComponents_4(int n, int[][] edges) { + public int countComponents_5(int n, int[][] edges) { int count = 0; List> g = new ArrayList<>(); boolean[] visited = new boolean[n];