diff --git a/Problem58.java b/Problem58.java new file mode 100644 index 00000000..de63bb61 --- /dev/null +++ b/Problem58.java @@ -0,0 +1,25 @@ +// Time Complexity : O(N) +// Space Complexity : O(h) + +class Solution { + private List> result; + public List> levelOrder(TreeNode root) { + this.result = new ArrayList<>(); + helper(root, 0); + return result; + } + + private void helper(TreeNode root, int level) { + //base + if(root == null) return; + + //logic + if (this.result.size() == level) { + result.add(new ArrayList<>()); + } + this.result.get(level).add(root.val); + + helper(root.left, level+1); + helper(root.right, level+1); + } +} \ No newline at end of file diff --git a/Problem59.java b/Problem59.java new file mode 100644 index 00000000..13ce0433 --- /dev/null +++ b/Problem59.java @@ -0,0 +1,46 @@ +// Time Complexity : O(V+E) +// Space Complexity : O(V+E) + +class Solution { + public boolean canFinish(int numCourses, int[][] prerequisites) { + int[] inDegrees = new int[numCourses]; + Map> coursesMap = new HashMap<>(); + + for (int[] prerequisit: prerequisites) { + // prerequisit[0] - dependent; prerequisit[1] - inDependent + inDegrees[prerequisit[0]]++; + coursesMap.putIfAbsent(prerequisit[1], new ArrayList<>()); + coursesMap.get(prerequisit[1]).add(prerequisit[0]); + } + + int count = 0; + Queue q = new LinkedList<>(); + + for (int i = 0; i < numCourses; i++) { + if (inDegrees[i] == 0) { + q.offer(i); + count++; + } + } + + if (q.isEmpty()) return false; + if (count == numCourses) return true; + + while (!q.isEmpty()) { + int inDependentCourse = q.poll(); + List dependentCourses = coursesMap.get(inDependentCourse); + if (dependentCourses != null) { + for (int dependentCourse: dependentCourses) { + inDegrees[dependentCourse]--; + if (inDegrees[dependentCourse] == 0) { + q.offer(dependentCourse); + count++; + if (count == numCourses) return true; + } + } + } + } + + return false; + } +} \ No newline at end of file