From 0fbe1b2517bf1a5752ef6915e54f8b28806f1728 Mon Sep 17 00:00:00 2001 From: ThanhNIT Date: Fri, 15 Nov 2024 11:10:24 +0700 Subject: [PATCH 1/6] Updated tag for tasks 139-208 --- .../g0101_0200/s0139_word_break/Solution.java | 44 +++--- .../s0141_linked_list_cycle/Solution.java | 2 +- .../s0142_linked_list_cycle_ii/Solution.java | 2 +- .../g0101_0200/s0146_lru_cache/LRUCache.java | 2 +- .../g0101_0200/s0148_sort_list/Solution.java | 2 +- .../Solution.java | 29 ++-- .../Solution.java | 2 +- .../g0101_0200/s0155_min_stack/MinStack.java | 2 +- .../Solution.java | 2 +- .../s0169_majority_element/Solution.java | 2 +- .../s0189_rotate_array/Solution.java | 2 +- .../s0198_house_robber/Solution.java | 2 +- .../s0200_number_of_islands/Solution.java | 2 +- .../s0206_reverse_linked_list/Solution.java | 2 +- .../s0207_course_schedule/Solution.java | 2 +- .../Trie.java | 142 +++++++++++++----- 16 files changed, 148 insertions(+), 93 deletions(-) diff --git a/src/main/java/g0101_0200/s0139_word_break/Solution.java b/src/main/java/g0101_0200/s0139_word_break/Solution.java index 8f62cbf77..d018e48cb 100644 --- a/src/main/java/g0101_0200/s0139_word_break/Solution.java +++ b/src/main/java/g0101_0200/s0139_word_break/Solution.java @@ -3,43 +3,37 @@ // #Medium #Top_100_Liked_Questions #Top_Interview_Questions #String #Hash_Table // #Dynamic_Programming #Trie #Memoization #Algorithm_II_Day_15_Dynamic_Programming // #Dynamic_Programming_I_Day_9 #Udemy_Dynamic_Programming #Big_O_Time_O(M+max*N)_Space_O(M+N+max) -// #2022_06_24_Time_2_ms_(97.08%)_Space_42.1_MB_(90.92%) +// #2024_11_15_Time_1_ms_(99.42%)_Space_42.1_MB_(80.42%) import java.util.HashSet; import java.util.List; import java.util.Set; public class Solution { + Boolean[] memo; public boolean wordBreak(String s, List wordDict) { - Set set = new HashSet<>(); - int max = 0; - boolean[] flag = new boolean[s.length() + 1]; - for (String st : wordDict) { - set.add(st); - if (max < st.length()) { - max = st.length(); - } - } - for (int i = 1; i <= max; i++) { - if (dfs(s, 0, i, max, set, flag)) { - return true; - } - } - return false; + memo = new Boolean[s.length() + 1]; + return dp(s, 0, wordDict); } - private boolean dfs(String s, int start, int end, int max, Set set, boolean[] flag) { - if (!flag[end] && set.contains(s.substring(start, end))) { - flag[end] = true; - if (end == s.length()) { - return true; + public boolean dp(String s, int i, List wordDict){ + if(i == s.length()) return true; + if(memo[i] != null) return memo[i]; + for(String word: wordDict){ + int len = word.length(); + if(i + len > s.length()){ + continue; } - for (int i = 1; i <= max; i++) { - if (end + i <= s.length() && dfs(s, end, end + i, max, set, flag)) { - return true; - } + String subStr = s.substring(i, i + len); + if(!subStr.equals(word)){ + continue; + } + if(dp(s, i + len, wordDict)){ + memo[i] = true; + return true; } } + memo[i] = false; return false; } } diff --git a/src/main/java/g0101_0200/s0141_linked_list_cycle/Solution.java b/src/main/java/g0101_0200/s0141_linked_list_cycle/Solution.java index 72066f45f..bb5703a82 100644 --- a/src/main/java/g0101_0200/s0141_linked_list_cycle/Solution.java +++ b/src/main/java/g0101_0200/s0141_linked_list_cycle/Solution.java @@ -2,7 +2,7 @@ // #Easy #Top_100_Liked_Questions #Top_Interview_Questions #Hash_Table #Two_Pointers #Linked_List // #Data_Structure_I_Day_7_Linked_List #Udemy_Linked_List #Big_O_Time_O(N)_Space_O(1) -// #2022_06_24_Time_0_ms_(100.00%)_Space_45.5_MB_(68.52%) +// #2024_11_15_Time_0_ms_(100.00%)_Space_44.3_MB_(52.46%) import com_github_leetcode.ListNode; diff --git a/src/main/java/g0101_0200/s0142_linked_list_cycle_ii/Solution.java b/src/main/java/g0101_0200/s0142_linked_list_cycle_ii/Solution.java index 559cb953d..8bcdf03a9 100644 --- a/src/main/java/g0101_0200/s0142_linked_list_cycle_ii/Solution.java +++ b/src/main/java/g0101_0200/s0142_linked_list_cycle_ii/Solution.java @@ -2,7 +2,7 @@ // #Medium #Top_100_Liked_Questions #Hash_Table #Two_Pointers #Linked_List // #Data_Structure_II_Day_10_Linked_List #Level_1_Day_4_Linked_List #Udemy_Linked_List -// #Big_O_Time_O(N)_Space_O(1) #2022_06_24_Time_0_ms_(100.00%)_Space_42.3_MB_(98.70%) +// #Big_O_Time_O(N)_Space_O(1) #2024_11_15_Time_0_ms_(100.00%)_Space_44.7_MB_(20.31%) import com_github_leetcode.ListNode; diff --git a/src/main/java/g0101_0200/s0146_lru_cache/LRUCache.java b/src/main/java/g0101_0200/s0146_lru_cache/LRUCache.java index 791b20209..2bd2122b4 100644 --- a/src/main/java/g0101_0200/s0146_lru_cache/LRUCache.java +++ b/src/main/java/g0101_0200/s0146_lru_cache/LRUCache.java @@ -2,7 +2,7 @@ // #Medium #Top_100_Liked_Questions #Top_Interview_Questions #Hash_Table #Design #Linked_List // #Doubly_Linked_List #Udemy_Linked_List #Big_O_Time_O(1)_Space_O(capacity) -// #2022_06_24_Time_87_ms_(50.80%)_Space_125.2_MB_(58.73%) +// #2024_11_15_Time_40_ms_(98.20%)_Space_111.4_MB_(88.70%) import java.util.HashMap; import java.util.Map; diff --git a/src/main/java/g0101_0200/s0148_sort_list/Solution.java b/src/main/java/g0101_0200/s0148_sort_list/Solution.java index 2f6953f93..d09579952 100644 --- a/src/main/java/g0101_0200/s0148_sort_list/Solution.java +++ b/src/main/java/g0101_0200/s0148_sort_list/Solution.java @@ -2,7 +2,7 @@ // #Medium #Top_100_Liked_Questions #Top_Interview_Questions #Sorting #Two_Pointers #Linked_List // #Divide_and_Conquer #Merge_Sort #Level_2_Day_4_Linked_List #Big_O_Time_O(log(N))_Space_O(log(N)) -// #2022_06_24_Time_12_ms_(85.82%)_Space_76_MB_(43.84%) +// #2024_11_15_Time_9_ms_(93.90%)_Space_56.9_MB_(37.47%) import com_github_leetcode.ListNode; diff --git a/src/main/java/g0101_0200/s0152_maximum_product_subarray/Solution.java b/src/main/java/g0101_0200/s0152_maximum_product_subarray/Solution.java index a5c494e6c..7270fda13 100644 --- a/src/main/java/g0101_0200/s0152_maximum_product_subarray/Solution.java +++ b/src/main/java/g0101_0200/s0152_maximum_product_subarray/Solution.java @@ -2,23 +2,24 @@ // #Medium #Top_100_Liked_Questions #Top_Interview_Questions #Array #Dynamic_Programming // #Dynamic_Programming_I_Day_6 #Level_2_Day_13_Dynamic_Programming #Udemy_Dynamic_Programming -// #Big_O_Time_O(N)_Space_O(1) #2024_07_03_Time_1_ms_(92.31%)_Space_44.6_MB_(75.65%) +// #Big_O_Time_O(N)_Space_O(1) #2024_11_15_Time_1_ms_(92.74%)_Space_45_MB_(23.41%) public class Solution { public int maxProduct(int[] nums) { - int currentMaxProd = nums[0]; - int currentMinProd = nums[0]; - int overAllMaxProd = nums[0]; - for (int i = 1; i < nums.length; i++) { - if (nums[i] < 0) { - int temp = currentMaxProd; - currentMaxProd = currentMinProd; - currentMinProd = temp; - } - currentMaxProd = Math.max(nums[i], nums[i] * currentMaxProd); - currentMinProd = Math.min(nums[i], nums[i] * currentMinProd); - overAllMaxProd = Math.max(overAllMaxProd, currentMaxProd); + int m=Integer.MIN_VALUE; + int n=nums.length; + int start=1; + int end=1; + for(int i=0;i Date: Fri, 15 Nov 2024 11:16:50 +0700 Subject: [PATCH 2/6] update --- .../g0101_0200/s0139_word_break/Solution.java | 23 +-- .../Solution.java | 27 ++-- .../Trie.java | 146 ++++++++---------- 3 files changed, 89 insertions(+), 107 deletions(-) diff --git a/src/main/java/g0101_0200/s0139_word_break/Solution.java b/src/main/java/g0101_0200/s0139_word_break/Solution.java index d018e48cb..837f54d7e 100644 --- a/src/main/java/g0101_0200/s0139_word_break/Solution.java +++ b/src/main/java/g0101_0200/s0139_word_break/Solution.java @@ -5,30 +5,33 @@ // #Dynamic_Programming_I_Day_9 #Udemy_Dynamic_Programming #Big_O_Time_O(M+max*N)_Space_O(M+N+max) // #2024_11_15_Time_1_ms_(99.42%)_Space_42.1_MB_(80.42%) -import java.util.HashSet; import java.util.List; -import java.util.Set; public class Solution { - Boolean[] memo; + private Boolean[] memo; + public boolean wordBreak(String s, List wordDict) { memo = new Boolean[s.length() + 1]; return dp(s, 0, wordDict); } - public boolean dp(String s, int i, List wordDict){ - if(i == s.length()) return true; - if(memo[i] != null) return memo[i]; - for(String word: wordDict){ + public boolean dp(String s, int i, List wordDict) { + if (i == s.length()) { + return true; + } + if (memo[i] != null) { + return memo[i]; + } + for (String word : wordDict) { int len = word.length(); - if(i + len > s.length()){ + if (i + len > s.length()) { continue; } String subStr = s.substring(i, i + len); - if(!subStr.equals(word)){ + if (!subStr.equals(word)) { continue; } - if(dp(s, i + len, wordDict)){ + if (dp(s, i + len, wordDict)) { memo[i] = true; return true; } diff --git a/src/main/java/g0101_0200/s0152_maximum_product_subarray/Solution.java b/src/main/java/g0101_0200/s0152_maximum_product_subarray/Solution.java index 7270fda13..7c23c9fa1 100644 --- a/src/main/java/g0101_0200/s0152_maximum_product_subarray/Solution.java +++ b/src/main/java/g0101_0200/s0152_maximum_product_subarray/Solution.java @@ -6,19 +6,20 @@ public class Solution { public int maxProduct(int[] nums) { - int m=Integer.MIN_VALUE; - int n=nums.length; - int start=1; - int end=1; - for(int i=0;i Date: Fri, 15 Nov 2024 11:18:42 +0700 Subject: [PATCH 3/6] Update Trie.java --- .../java/g0201_0300/s0208_implement_trie_prefix_tree/Trie.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/g0201_0300/s0208_implement_trie_prefix_tree/Trie.java b/src/main/java/g0201_0300/s0208_implement_trie_prefix_tree/Trie.java index 0c9e8d55c..f55e82bbb 100644 --- a/src/main/java/g0201_0300/s0208_implement_trie_prefix_tree/Trie.java +++ b/src/main/java/g0201_0300/s0208_implement_trie_prefix_tree/Trie.java @@ -11,6 +11,7 @@ public class Trie { private boolean ans = false; private final TrieNode[] trees = new TrieNode[26]; + public Trie() {} TrieNode mapWordToTree(TrieNode t, String word, int i) { From eae2b4e59897b811f8bc446f276a9ab03e2bd2ff Mon Sep 17 00:00:00 2001 From: ThanhNIT Date: Fri, 15 Nov 2024 11:25:14 +0700 Subject: [PATCH 4/6] update --- src/main/java/g0101_0200/s0139_word_break/Solution.java | 6 +----- .../g0201_0300/s0208_implement_trie_prefix_tree/Trie.java | 2 -- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/src/main/java/g0101_0200/s0139_word_break/Solution.java b/src/main/java/g0101_0200/s0139_word_break/Solution.java index 837f54d7e..1568b3a15 100644 --- a/src/main/java/g0101_0200/s0139_word_break/Solution.java +++ b/src/main/java/g0101_0200/s0139_word_break/Solution.java @@ -24,11 +24,7 @@ public boolean dp(String s, int i, List wordDict) { } for (String word : wordDict) { int len = word.length(); - if (i + len > s.length()) { - continue; - } - String subStr = s.substring(i, i + len); - if (!subStr.equals(word)) { + if (i + len > s.length() || !s.substring(i, i + len).equals(word)) { continue; } if (dp(s, i + len, wordDict)) { diff --git a/src/main/java/g0201_0300/s0208_implement_trie_prefix_tree/Trie.java b/src/main/java/g0201_0300/s0208_implement_trie_prefix_tree/Trie.java index f55e82bbb..993f6f6fa 100644 --- a/src/main/java/g0201_0300/s0208_implement_trie_prefix_tree/Trie.java +++ b/src/main/java/g0201_0300/s0208_implement_trie_prefix_tree/Trie.java @@ -12,8 +12,6 @@ public class Trie { private boolean ans = false; private final TrieNode[] trees = new TrieNode[26]; - public Trie() {} - TrieNode mapWordToTree(TrieNode t, String word, int i) { char m = word.charAt(i); boolean found = false; From 1cd4d25f2ed5a57382108cb5be22d81f87db01ee Mon Sep 17 00:00:00 2001 From: Valentyn Kolesnikov Date: Fri, 15 Nov 2024 07:10:49 +0200 Subject: [PATCH 5/6] Update Trie.java --- .../Trie.java | 119 ++++++------------ 1 file changed, 41 insertions(+), 78 deletions(-) diff --git a/src/main/java/g0201_0300/s0208_implement_trie_prefix_tree/Trie.java b/src/main/java/g0201_0300/s0208_implement_trie_prefix_tree/Trie.java index 993f6f6fa..6a68ecc96 100644 --- a/src/main/java/g0201_0300/s0208_implement_trie_prefix_tree/Trie.java +++ b/src/main/java/g0201_0300/s0208_implement_trie_prefix_tree/Trie.java @@ -3,104 +3,67 @@ // #Medium #Top_100_Liked_Questions #Top_Interview_Questions #String #Hash_Table #Design #Trie // #Level_2_Day_16_Design #Udemy_Trie_and_Heap // #Big_O_Time_O(word.length())_or_O(prefix.length())_Space_O(N) -// #2024_11_15_Time_30_ms_(99.78%)_Space_55.1_MB_(72.51%) - -import java.util.Arrays; +// #2024_11_15_Time_32_ms_(95.05%)_Space_54.9_MB_(91.16%) @SuppressWarnings("java:S1104") public class Trie { - private boolean ans = false; - private final TrieNode[] trees = new TrieNode[26]; + private final TrieNode root; + private boolean startWith; - TrieNode mapWordToTree(TrieNode t, String word, int i) { - char m = word.charAt(i); - boolean found = false; - TrieNode a = t.nexts[m - 'a']; - if (a != null) { - if (i != word.length() - 1) { - mapWordToTree(a, word, i + 1); - } else { - a.end = true; - } - found = true; - } - if (!found) { - TrieNode prev = t; - for (int j = i; j < word.length(); j++) { - TrieNode temp = new TrieNode(word.charAt(j)); - prev.nexts[word.charAt(j) - 'a'] = temp; - prev = temp; - } - prev.end = true; + private static class TrieNode { + // Initialize your data structure here. + public TrieNode[] children; + public boolean isWord; + + public TrieNode() { + children = new TrieNode[26]; } - return t; } + public Trie() { + root = new TrieNode(); + } + + // Inserts a word into the trie. public void insert(String word) { - char a = word.charAt(0); - if (trees[a - 'a'] == null) { - TrieNode t = new TrieNode(a); - trees[a - 'a'] = t; - } - if (1 == word.length()) { - trees[a - 'a'].end = true; - return; - } - trees[a - 'a'] = mapWordToTree(trees[a - 'a'], word, 1); + insert(word, root, 0); } - public boolean searchWordInTree(TrieNode t, String word, int i) { - char a = word.charAt(i); - TrieNode m = t.nexts[a - 'a']; - if (m != null) { - if (i == word.length() - 1) { - ans = true; - return m.end; - } - return searchWordInTree(m, word, i + 1); + private void insert(String word, TrieNode root, int idx) { + if (idx == word.length()) { + root.isWord = true; + return; + } + int index = word.charAt(idx) - 'a'; + if (root.children[index] == null) { + root.children[index] = new TrieNode(); } - return false; + insert(word, root.children[index], idx + 1); } + // Returns if the word is in the trie. public boolean search(String word) { - char a = word.charAt(0); - if (trees[a - 'a'] == null) { - return false; - } else { - if (1 == word.length()) { - return trees[a - 'a'].end; - } - return searchWordInTree(trees[a - 'a'], word, 1); - } + return search(word, root, 0); } - public boolean startsWith(String prefix) { - char a = prefix.charAt(0); - ans = false; - if (trees[a - 'a'] == null) { + private boolean search(String word, TrieNode root, int idx) { + if (idx == word.length()) { + startWith = true; + return root.isWord; + } + int index = word.charAt(idx) - 'a'; + if (root.children[index] == null) { + startWith = false; return false; - } else { - if (1 == prefix.length()) { - return true; - } - searchWordInTree(trees[a - 'a'], prefix, 1); } - return ans; + return search(word, root.children[index], idx + 1); } - static class TrieNode { - char val; - boolean end = false; - TrieNode[] nexts = new TrieNode[26]; - - TrieNode(char val) { - this.val = val; - } - - @Override - public String toString() { - return val + " " + Arrays.toString(nexts) + " " + end; - } + // Returns if there is any word in the trie + // that starts with the given prefix. + public boolean startsWith(String prefix) { + search(prefix); + return startWith; } } From afc2de729726d98a83cd6fdb63233aae52ebcee6 Mon Sep 17 00:00:00 2001 From: Valentyn Kolesnikov Date: Fri, 15 Nov 2024 07:12:33 +0200 Subject: [PATCH 6/6] Update Solution.java --- .../g0101_0200/s0152_maximum_product_subarray/Solution.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/g0101_0200/s0152_maximum_product_subarray/Solution.java b/src/main/java/g0101_0200/s0152_maximum_product_subarray/Solution.java index 7c23c9fa1..1e8f8c0c2 100644 --- a/src/main/java/g0101_0200/s0152_maximum_product_subarray/Solution.java +++ b/src/main/java/g0101_0200/s0152_maximum_product_subarray/Solution.java @@ -6,7 +6,7 @@ public class Solution { public int maxProduct(int[] nums) { - int m = Integer.MIN_VALUE; + int overAllMaxProd = Integer.MIN_VALUE; int n = nums.length; int start = 1; int end = 1; @@ -19,8 +19,8 @@ public int maxProduct(int[] nums) { } start = start * nums[i]; end = end * nums[n - i - 1]; - m = Math.max(m, Math.max(start, end)); + overAllMaxProd = Math.max(overAllMaxProd, Math.max(start, end)); } - return m; + return overAllMaxProd; } }