From 6350714d956d28eaa3ea2451acb4cca7bf3374b6 Mon Sep 17 00:00:00 2001 From: Rakesh Tirumala Date: Thu, 4 Jan 2024 23:35:37 -0500 Subject: [PATCH 1/8] Create 1898-maximum-number-of-removable-characters.java --- ...aximum-number-of-removable-characters.java | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 java/1898-maximum-number-of-removable-characters.java diff --git a/java/1898-maximum-number-of-removable-characters.java b/java/1898-maximum-number-of-removable-characters.java new file mode 100644 index 000000000..6da73cb63 --- /dev/null +++ b/java/1898-maximum-number-of-removable-characters.java @@ -0,0 +1,38 @@ +class Solution { + public int maximumRemovals(String s, String p, int[] removable) { + return binarySearch(s, p, removable); + } + + private boolean isSubsequence(String s, String p, int[] removable, int k) { + Set removedSet = new HashSet<>(); + for (int i = 0; i < k; i++) { + removedSet.add(removable[i]); + } + + int i = 0, j = 0; + while (i < s.length() && j < p.length()) { + if (removedSet.contains(i) || s.charAt(i) != p.charAt(j)) { + i++; + } else { + i++; + j++; + } + } + return j == p.length(); + } + + private int binarySearch(String s, String p, int[] removable) { + int left = 0, right = removable.length + 1; + + while (left < right) { + int mid = (left + right) / 2; + if (isSubsequence(s, p, removable, mid)) { + left = mid + 1; + } else { + right = mid; + } + } + + return left - 1; + } +} From 63465028b77abadda8a1c200c38fb88000c0757b Mon Sep 17 00:00:00 2001 From: Rakesh Tirumala Date: Thu, 4 Jan 2024 23:41:31 -0500 Subject: [PATCH 2/8] Create 1898-maximum-number-of-removable-characters.py --- ...-maximum-number-of-removable-characters.py | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 python/1898-maximum-number-of-removable-characters.py diff --git a/python/1898-maximum-number-of-removable-characters.py b/python/1898-maximum-number-of-removable-characters.py new file mode 100644 index 000000000..ca4bc1922 --- /dev/null +++ b/python/1898-maximum-number-of-removable-characters.py @@ -0,0 +1,27 @@ +class Solution: + def maximumRemovals(self, s: str, p: str, removable: list[int]) -> int: + return self.binary_search(s, p, removable) + + def is_subsequence(self, s: str, p: str, removable: list[int], k: int) -> bool: + removed_set = set(removable[:k]) + + i, j = 0, 0 + while i < len(s) and j < len(p): + if i in removed_set or s[i] != p[j]: + i += 1 + else: + i += 1 + j += 1 + return j == len(p) + + def binary_search(self, s: str, p: str, removable: list[int]) -> int: + left, right = 0, len(removable) + 1 + + while left < right: + mid = (left + right) // 2 + if self.is_subsequence(s, p, removable, mid): + left = mid + 1 + else: + right = mid + + return left - 1 From a18a60945e88d49ac3af46d6ab47175778eae789 Mon Sep 17 00:00:00 2001 From: Rakesh Tirumala Date: Fri, 12 Jan 2024 11:56:02 -0500 Subject: [PATCH 3/8] Created 0144-Binary-Tree-Preorder-Traversal.java --- java/0144-Binary-Tree-Preorder-Traversal.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 java/0144-Binary-Tree-Preorder-Traversal.java diff --git a/java/0144-Binary-Tree-Preorder-Traversal.java b/java/0144-Binary-Tree-Preorder-Traversal.java new file mode 100644 index 000000000..c2b719f1e --- /dev/null +++ b/java/0144-Binary-Tree-Preorder-Traversal.java @@ -0,0 +1,16 @@ +class Solution { + public List preorderTraversal(TreeNode root) { + List res = new ArrayList<>(); + Stack stack = new Stack<>(); + TreeNode current = root; + while(current!=null || !stack.isEmpty()){ + while(current!=null){ + res.add(current.val); + stack.add(current.right); + current = current.left; + } + current = stack.pop(); + } + return res; + } +} From c04128188ee24e08da85817337ce39f0181280fb Mon Sep 17 00:00:00 2001 From: Rakesh Tirumala Date: Fri, 12 Jan 2024 11:57:12 -0500 Subject: [PATCH 4/8] Rename 0144-Binary-Tree-Preorder-Traversal.java to 0144-binary-tree-preorder-traversal.java --- ...er-Traversal.java => 0144-binary-tree-preorder-traversal.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename java/{0144-Binary-Tree-Preorder-Traversal.java => 0144-binary-tree-preorder-traversal.java} (100%) diff --git a/java/0144-Binary-Tree-Preorder-Traversal.java b/java/0144-binary-tree-preorder-traversal.java similarity index 100% rename from java/0144-Binary-Tree-Preorder-Traversal.java rename to java/0144-binary-tree-preorder-traversal.java From 5970fa6272dc3767f2a77bf70fe0f762d4c0312d Mon Sep 17 00:00:00 2001 From: Rakesh Tirumala Date: Fri, 12 Jan 2024 12:32:27 -0500 Subject: [PATCH 5/8] Created 0783-minimum-distance-between-bst-nodes.java --- ...83-minimum-distance-between-bst-nodes.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 java/0783-minimum-distance-between-bst-nodes.java diff --git a/java/0783-minimum-distance-between-bst-nodes.java b/java/0783-minimum-distance-between-bst-nodes.java new file mode 100644 index 000000000..e867a1a59 --- /dev/null +++ b/java/0783-minimum-distance-between-bst-nodes.java @@ -0,0 +1,23 @@ +class Solution { + int minDiff = Integer.MAX_VALUE; + int prevValue = -1; + + public int minDiffInBST(TreeNode root) { + helperMethod(root); + return minDiff; + } + + public void helperMethod(TreeNode curr) { + if (curr == null) return; + + helperMethod(curr.left); + + if (prevValue != -1) { + minDiff = Math.min(minDiff, Math.abs(curr.val - prevValue)); + } + + prevValue = curr.val; + + helperMethod(curr.right); + } +} From 791d93d8d6e1bd937b021408a8f0782c07a0cfa9 Mon Sep 17 00:00:00 2001 From: Rakesh Tirumala Date: Fri, 12 Jan 2024 13:04:02 -0500 Subject: [PATCH 6/8] Created 101-symmetric-tree.java --- java/101-symmetric-tree.java | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 java/101-symmetric-tree.java diff --git a/java/101-symmetric-tree.java b/java/101-symmetric-tree.java new file mode 100644 index 000000000..3b5adb81e --- /dev/null +++ b/java/101-symmetric-tree.java @@ -0,0 +1,26 @@ +/** + * Definition for a binary tree node. + * public class TreeNode { + * int val; + * TreeNode left; + * TreeNode right; + * TreeNode() {} + * TreeNode(int val) { this.val = val; } + * TreeNode(int val, TreeNode left, TreeNode right) { + * this.val = val; + * this.left = left; + * this.right = right; + * } + * } + */ +class Solution { + public boolean isSymmetric(TreeNode root) { + return helperMethod(root, root); + } + public boolean helperMethod(TreeNode left, TreeNode right){ + if(left==null && right==null) return true; + if(left==null || right==null) return false; + + return (left.val==right.val) && helperMethod(left.left, right.right) && helperMethod(left.right, right.left); + } +} From 40e983bc8d413223bf1c78a6347e2693eed02e1b Mon Sep 17 00:00:00 2001 From: Rakesh Tirumala Date: Fri, 12 Jan 2024 13:22:46 -0500 Subject: [PATCH 7/8] Rename 101-symmetric-tree.java to 0101-symmetric-tree.java --- java/{101-symmetric-tree.java => 0101-symmetric-tree.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename java/{101-symmetric-tree.java => 0101-symmetric-tree.java} (100%) diff --git a/java/101-symmetric-tree.java b/java/0101-symmetric-tree.java similarity index 100% rename from java/101-symmetric-tree.java rename to java/0101-symmetric-tree.java From ca2c275a1c5082d3233bd8068707941e6bd5367d Mon Sep 17 00:00:00 2001 From: Rakesh Tirumala Date: Wed, 31 Jan 2024 17:09:07 -0500 Subject: [PATCH 8/8] Update 0450-delete-node-in-a-bst.java The earlier code provided wasn't working for all cases. I have edited the code. --- java/0450-delete-node-in-a-bst.java | 36 +++++++++++------------------ 1 file changed, 14 insertions(+), 22 deletions(-) diff --git a/java/0450-delete-node-in-a-bst.java b/java/0450-delete-node-in-a-bst.java index 94a26dd35..f05a8249a 100644 --- a/java/0450-delete-node-in-a-bst.java +++ b/java/0450-delete-node-in-a-bst.java @@ -1,32 +1,24 @@ -/** - * TC : log (n) - * - * */ class Solution { - public TreeNode minimumVal(TreeNode root) { - TreeNode curr = root; - while (curr != null && curr.left != null) { - curr = curr.left; + public TreeNode findMin(TreeNode node) { + TreeNode current = node; + while (current.left != null) { + current = current.left; } - return curr; + return current; } public TreeNode deleteNode(TreeNode root, int key) { if (root == null) return null; - if (key > root.val) { - root.right = deleteNode(root.right, key); - } else if (key < root.val) { - root.left = deleteNode(root.left, key); - } else { - if (root.left == null) { - return root.right; - } else if (root.right == null) { - return root.left; - } else { - TreeNode minVal = minimumVal(root); - root.val = minVal.val; - root.right = deleteNode(root.right, minVal.val); + if (root.val > key) root.left = deleteNode(root.left, key); + else if (root.val < key) root.right = deleteNode(root.right, key); + else { + if (root.left == null) return root.right; + else if (root.right == null) return root.left; + else { + TreeNode successor = findMin(root.right); + root.val = successor.val; + root.right = deleteNode(root.right, successor.val); } } return root;