diff --git a/binary-tree-maximum-path-sum/minji-go.java b/binary-tree-maximum-path-sum/minji-go.java new file mode 100644 index 000000000..7acc3c38a --- /dev/null +++ b/binary-tree-maximum-path-sum/minji-go.java @@ -0,0 +1,26 @@ +/** + * week11-5. binary-tree-maximum-path-sum + *
  • Description: Given the root of a binary tree, return the maximum path sum of any non-empty path
  • + *
  • Topics: Dynamic Programming, Tree, Depth-First Search, Binary Tree
  • + *
  • Time Complexity: O(N), Runtime 0ms
  • + *
  • Space Complexity: O(H), Memory 44.1MB
  • + */ +class Solution { + public int maxPathSum(TreeNode root) { + dfs(root); + return max; + } + + int max = Integer.MIN_VALUE; + public int dfs(TreeNode head) { + if (head == null) return 0; + + int left = Math.max(0, dfs(head.left)); + int right = Math.max(0, dfs(head.right)); + + max = Math.max(max, head.val + left + right); + + return head.val + Math.max(left, right); + } + +} diff --git a/course-schedule/minji-go.java b/course-schedule/minji-go.java new file mode 100644 index 000000000..2554d7c58 --- /dev/null +++ b/course-schedule/minji-go.java @@ -0,0 +1,45 @@ +/** + * week10-3. course-schedule + *
  • Description: Return true if you can finish all courses. Otherwise, return false
  • + *
  • Topics: Depth-First Search, Breadth-First Search, Graph, Topological Sort
  • + *
  • Time Complexity: O(N+E), Runtime 7ms
  • + *
  • Space Complexity: O(N+E), Memory 45.68MB
  • + *
  • Note : refer to the answer. remember the topic of topological sort
  • + */ +class Solution { + public boolean canFinish(int numCourses, int[][] prerequisites) { + int[] inDegree = new int[numCourses]; + List> graph = new ArrayList<>(); + for (int i=0; i()); + } + + for(int[] pre : prerequisites) { + int dest = pre[0], src = pre[1]; + graph.get(src).add(dest); + inDegree[dest]++; + } + + Queue queue = new LinkedList<>(); + for (int i=0; iweek10-1. invert-binary-tree + *
  • Description: Design an algorithm to serialize and deserialize a binary tree
  • + *
  • Topics: Tree, Depth-First Search, Breadth-First Search, Binary Tree
  • + *
  • Time Complexity: O(N), Runtime 0ms
  • + *
  • Space Complexity: O(N), Memory 41.28MB
  • + */ +class Solution { + public TreeNode invertTree(TreeNode root) { + if (root == null) return null; + + Queue queue = new LinkedList<>(); + queue.offer(root); + + while (!queue.isEmpty()) { + TreeNode parent = queue.poll(); + TreeNode temp = parent.left; + parent.left = parent.right; + parent.right = temp; + if (parent.left != null) queue.offer(parent.left); + if (parent.right != null) queue.offer(parent.right); + } + + return root; + } +} diff --git a/jump-game/minji-go.java b/jump-game/minji-go.java new file mode 100644 index 000000000..2a00b0540 --- /dev/null +++ b/jump-game/minji-go.java @@ -0,0 +1,19 @@ +/** + * week10-4. jump-game + *
  • Description: Return true if you can reach the last index, or false otherwise
  • + *
  • Topics: Array, Dynamic Programming, Greedy
  • + *
  • Time Complexity: O(N), Runtime 2ms
  • + *
  • Space Complexity: O(1), Memory 45.66MB
  • + */ +class Solution { + public boolean canJump(int[] nums) { + int jump = 0; + for (int i = 0; i <= jump; i++) { + jump = Math.max(jump, i + nums[i]); + if (jump >= nums.length - 1) { + return true; + } + } + return false; + } +} diff --git a/merge-intervals/minji-go.java b/merge-intervals/minji-go.java new file mode 100644 index 000000000..036a9bddd --- /dev/null +++ b/merge-intervals/minji-go.java @@ -0,0 +1,28 @@ +/** + * week11-4. merge-intervals + *
  • Description: return an array of the non-overlapping intervals
  • + *
  • Topics: Array, Sorting
  • + *
  • Time Complexity: O(NlogN), Runtime 10ms
  • + *
  • Space Complexity: O(N), Memory 46.18MB
  • + */ +class Solution { + public int[][] merge(int[][] intervals) { + Arrays.sort(intervals, (i1, i2) -> i1[0] - i2[0]); + + List merge = new ArrayList<>(); + merge.add(intervals[0]); + + for (int i = 1; i < intervals.length; i++) { + int[] prev = merge.get(merge.size() - 1); + int[] curr = intervals[i]; + + if (curr[0] <= prev[1]) { + prev[1] = Math.max(prev[1], curr[1]); + } else { + merge.add(curr); + } + } + + return merge.toArray(new int[merge.size()][]); + } +} diff --git a/merge-k-sorted-lists/minji-go.java b/merge-k-sorted-lists/minji-go.java new file mode 100644 index 000000000..d0446a6db --- /dev/null +++ b/merge-k-sorted-lists/minji-go.java @@ -0,0 +1,51 @@ +/** + * week10-5. merge-k-sorted-lists + *
  • Description: Merge all the linked-lists into one sorted linked-list
  • + *
  • Topics: Linked List, Divide and Conquer, Heap (Priority Queue), Merge Sort
  • + *
  • Time Complexity: O(NlogK), Runtime 1ms
  • + *
  • Space Complexity: O(K), Memory 44.7MB
  • + */ +class Solution { + public ListNode mergeKLists(ListNode[] lists) { + if (lists == null || lists.length == 0) { + return null; + } + return mergeKLists(lists, 0, lists.length - 1); + } + + private ListNode mergeKLists(ListNode[] lists, int start, int end) { + if (start == end) { + return lists[start]; + } + + int mid = (start + end) / 2; + ListNode node1 = mergeKLists(lists, start, mid); + ListNode node2 = mergeKLists(lists, mid + 1, end); + return mergeTwoLists(node1, node2); + } + + private ListNode mergeTwoLists(ListNode node1, ListNode node2) { + ListNode dummy = new ListNode(-10_001); + ListNode merge = dummy; + + while (node1 != null && node2 != null) { + if (node1.val < node2.val) { + merge.next = node1; + merge = merge.next; + node1 = node1.next; + } else { + merge.next = node2; + merge = merge.next; + node2 = node2.next; + } + } + + if (node1 != null && node2 == null) { + merge.next = node1; + } else { + merge.next = node2; + } + + return dummy.next; + } +} diff --git a/missing-number/minji-go.java b/missing-number/minji-go.java index 61cc2894f..933c149f8 100644 --- a/missing-number/minji-go.java +++ b/missing-number/minji-go.java @@ -1,19 +1,16 @@ -/* - Problem: https://leetcode.com/problems/missing-number/ - Description: return the only number in the range that is missing from the array. - Concept: Array, Hash Table, Math, Binary Search, Bit Manipulation, Sorting - Time Complexity: O(N), Runtime 0ms - Space Complexity: O(1), Memory 45.71MB -*/ +/** + * week11-1. missing-number + *
  • Description: Return the only number in the range that is missing from the array
  • + *
  • Topics: Array, Hash Table, Math, Binary Search, Bit Manipulation, Sorting
  • + *
  • Time Complexity: O(N), Runtime 0ms
  • + *
  • Space Complexity: O(1), Memory 45.67MB
  • + */ class Solution { public int missingNumber(int[] nums) { - int n = nums.length; - int missing = n; - - for(int i=0; iweek12-3. non-overlapping-intervals + *
  • Description: return the minimum number of intervals you need to remove to make the rest of the intervals non-overlapping
  • + *
  • Topics: Array, Dynamic Programming, Greedy, Sorting
  • + *
  • Time Complexity: O(N), Runtime 45ms
  • + *
  • Space Complexity: O(1), Memory 73.45MB
  • + *
  • Note : refer to the answer
  • + */ +class Solution { + public int eraseOverlapIntervals(int[][] intervals) { + Arrays.sort(intervals, (i1, i2) -> i1[1] - i2[1]); + + int skip = 0; + int end = Integer.MIN_VALUE; + + for (int[] interval : intervals) { + if (interval[0] < end) { + skip++; + } else { + end = interval[1]; + } + } + + return skip; + } +} diff --git a/remove-nth-node-from-end-of-list/minji-go.java b/remove-nth-node-from-end-of-list/minji-go.java new file mode 100644 index 000000000..37a6e9efb --- /dev/null +++ b/remove-nth-node-from-end-of-list/minji-go.java @@ -0,0 +1,27 @@ +/** + * week12-2. remove-nth-node-from-end-of-list + *
  • Description: Given the head of a linked list, remove the nth node from the end of the list and return its head
  • + *
  • Topics: Linked List, Two Pointers
  • + *
  • Time Complexity: O(N), Runtime 0ms
  • + *
  • Space Complexity: O(1), Memory 41.95MB
  • + */ +class Solution { + public ListNode removeNthFromEnd(ListNode head, int n) { + ListNode dummy = new ListNode(0, head); + ListNode fast = dummy; + ListNode slow = dummy; + + for(int i=0; i<=n; i++){ + fast = fast.next; + } + + while (fast != null) { + slow = slow.next; + fast = fast.next; + } + + slow.next = slow.next.next; + + return dummy.next; + } +} diff --git a/reorder-list/minji-go.java b/reorder-list/minji-go.java new file mode 100644 index 000000000..b99f6b77c --- /dev/null +++ b/reorder-list/minji-go.java @@ -0,0 +1,29 @@ +/** + * week11-2. reorder-list + *
  • Description: Reorder the list to be on the following form: L0 → Ln → L1 → Ln - 1 → L2 → ...
  • + *
  • Topics: Linked List, Two Pointers, Stack, Recursion
  • + *
  • Time Complexity: O(N), Runtime 5ms
  • + *
  • Space Complexity: O(N), Memory 47.96MB
  • + */ +class Solution { + public void reorderList(ListNode head) { + Deque deque = new ArrayDeque<>(); + + ListNode node = head; + while (node != null) { + deque.addLast(node); + node = node.next; + } + + ListNode curr = deque.removeFirst(); + while (!deque.isEmpty()) { + curr.next = deque.removeLast(); + curr = curr.next; + if (!deque.isEmpty()) { + curr.next = deque.removeFirst(); + curr = curr.next; + } + } + curr.next = null; + } +} diff --git a/same-tree/minji-go.java b/same-tree/minji-go.java new file mode 100644 index 000000000..9a09ef02d --- /dev/null +++ b/same-tree/minji-go.java @@ -0,0 +1,36 @@ +import leetcode_study.TreeNode; + +import java.util.AbstractMap; +import java.util.Map; + +/** + * week12-1. same-tree + *
  • Description: Given the roots of two binary trees p and q, check if they are the same or not
  • + *
  • Topics: Tree, Depth-First Search, Breadth-First Search, Binary Tree
  • + *
  • Time Complexity: O(N), Runtime 0ms
  • + *
  • Space Complexity: O(N), Memory 41.14MB
  • + */ +class Solution { + public boolean isSameTree(TreeNode p, TreeNode q) { + Queue> queue = new LinkedList<>(); + queue.add(new AbstractMap.SimpleEntry<>(p, q)); + + while (!queue.isEmpty()) { + Map.Entry nodeMap = queue.poll(); + TreeNode nodeP = nodeMap.getKey(); + TreeNode nodeQ = nodeMap.getValue(); + + if (nodeP == null && nodeQ == null) { + continue; + } + if (nodeP == null || nodeQ == null || nodeP.val != nodeQ.val) { + return false; + } + + queue.add(new AbstractMap.SimpleEntry<>(nodeP.left, nodeQ.left)); + queue.add(new AbstractMap.SimpleEntry<>(nodeP.right, nodeQ.right)); + } + + return true; + } +} diff --git a/search-in-rotated-sorted-array/minji-go.java b/search-in-rotated-sorted-array/minji-go.java new file mode 100644 index 000000000..702dbc85c --- /dev/null +++ b/search-in-rotated-sorted-array/minji-go.java @@ -0,0 +1,60 @@ +/** + * week10-2. search-in-rotated-sorted-array + *
  • Description: nums is sorted in ascending order and is possibly rotated at an unknown pivot index. return the index of target if it is in nums, or -1
  • + *
  • Topics: Array, Binary Search
  • + *
  • Time Complexity: O(logN), Runtime 1ms
  • + *
  • Space Complexity: O(logN), Memory 43.23MB
  • + */ +class Solution { + public int search(int[] nums, int target) { + if(nums.length==1) { + if(nums[0]==target) return 0; + return -1; + } + + Queue queue = new LinkedList<>(); + queue.add(new int[]{0, nums.length-1}); + + int pivot = -1; + if(nums[0] nums.length-1) { + continue; + } + if(nums[mid]>nums[mid+1]) { + pivot=mid; + break; + } + queue.add(new int[]{q[0], mid}); + queue.add(new int[]{mid+1, q[1]}); + } + + int left = 0, right = nums.length-1; + if(target>=nums[0] && target<=nums[pivot]) { + right = pivot; + } else { + left = pivot+1; + } + + + while(left<=right){ + int mid = (left+right)/2; + if(target < nums[mid]) { + right=mid-1; + } else { + left=mid+1; + } + } + + if(nums[right] == target) { + return right; + } + + return -1; + } +} diff --git a/serialize-and-deserialize-binary-tree/minji-go.java b/serialize-and-deserialize-binary-tree/minji-go.java new file mode 100644 index 000000000..b7a6c1980 --- /dev/null +++ b/serialize-and-deserialize-binary-tree/minji-go.java @@ -0,0 +1,65 @@ +/** + * week12-4. serialize-and-deserialize-binary-tree + *
  • Description: Design an algorithm to serialize and deserialize a binary tree
  • + *
  • Topics: String, Tree, Depth-First Search, Breadth-First Search, Design, Binary Tree
  • + *
  • Time Complexity: O(N), Runtime 14ms
  • + *
  • Space Complexity: O(N), Memory 45.44MB
  • + */ +public class Codec { + + public String serialize(TreeNode root) { + if (root == null) { + return null; + } + + Queue queue = new LinkedList<>(); + queue.add(root); + + StringBuilder sb = new StringBuilder(); + while (!queue.isEmpty()) { + TreeNode node = queue.poll(); + if (node == null) { + sb.append("null,"); + continue; + } + sb.append(node.val).append(","); + queue.add(node.left); + queue.add(node.right); + } + + return sb.toString(); + } + + public TreeNode deserialize(String data) { + if (data == null) { + return null; + } + + String[] values = data.split(","); + + TreeNode root = new TreeNode(Integer.parseInt(values[0])); + Queue queue = new LinkedList<>(); + queue.add(root); + + int i = 1; + while (!queue.isEmpty()) { + TreeNode parent = queue.poll(); + + if (!values[i].equals("null")) { + TreeNode left = new TreeNode(Integer.parseInt(values[i])); + parent.left = left; + queue.add(left); + } + i++; + + if (!values[i].equals("null")) { + TreeNode right = new TreeNode(Integer.parseInt(values[i])); + parent.right = right; + queue.add(right); + } + i++; + } + + return root; + } +}