diff --git a/CourseSchedule.java b/CourseSchedule.java new file mode 100644 index 00000000..4b98a8b9 --- /dev/null +++ b/CourseSchedule.java @@ -0,0 +1,53 @@ +// Time Complexity : O(V+E). +// Space Complexity : O(V+E) +// Did this code successfully run on Leetcode : Yes +// Approach : We first build a hashmap to represent which courses depend on which prerequisites, and an indegrees array to count how many prerequisites each course has. +//Next, we enqueue all courses with zero indegree (no prerequisites) — these can be taken first. +//Using BFS, we repeatedly dequeue a course, reduce the indegree of its dependent courses, and enqueue them once their indegree becomes zero. +//If we process all numCourses this way, it means all courses can be completed and no cycle can be formed. + +class Solution { + public boolean canFinish(int numCourses, int[][] prerequisites) { + + int[] indegrees = new int[numCourses]; + HashMap> map = new HashMap<>(); + + for(int[] pr : prerequisites){ // pr[0] is dependent courses, pr[1] is independent courses + + indegrees[pr[0]]++; //construct indegrees array + map.putIfAbsent(pr[1], new ArrayList<>()); //construct hashmap + map.get(pr[1]).add(pr[0]); + } + + int count = 0; + Queue q = new LinkedList<>(); + + for(int i = 0; i < numCourses; i++){ + if(indegrees[i] == 0){ //add indegrees elements to queue + q.add(i); + count++; + } + } + + if(q.isEmpty()) return false; + if(count == numCourses) return true; + + //BFS technique with queue + while(!q.isEmpty()){ + int curr = q.poll(); + List dependencies = map.get(curr); + if(dependencies != null){ + for(int dependent : dependencies){ + indegrees[dependent]--; + if(indegrees[dependent] == 0){ + q.add(dependent); + count++; + if(count == numCourses) return true; + } + } + } + } + + return false; + } +} \ No newline at end of file diff --git a/LevelOrderTraversal.java b/LevelOrderTraversal.java new file mode 100644 index 00000000..62d66297 --- /dev/null +++ b/LevelOrderTraversal.java @@ -0,0 +1,34 @@ +// Time Complexity : O(n). +// Space Complexity : O(n) +// Did this code successfully run on Leetcode : Yes +// Approach : I have used BFS approach to solve this with the help of queue as I can achieve FIFO. We add nodes to the queue and maintain size to determine +// the level. And we remove node from queue, for each node we reduce the size and do this until complete level is removed. Along woth this we add the corresponding +// left and right values to the queue as well and continue the process. + +class Solution { + public List> levelOrder(TreeNode root) { + List> result = new ArrayList<>(); + if(root == null){ + return result; + } + Queue queue = new LinkedList<>(); //initialize queue + queue.add(root); //add root to queue + while(!queue.isEmpty()){ + int size = queue.size(); //maintain size for each level + List temp = new ArrayList<>(); //temp List to store each level + while(size > 0){ + TreeNode curr = queue.poll(); //remove one root + temp.add(curr.val); + if(curr.left != null){ //add corresponding left + queue.add(curr.left); + } + if(curr.right != null){ //add corresponding right + queue.add(curr.right); + } + size--; //reduce size as we poll each node + } + result.add(temp); // add the temp list to final result List + } + return result; + } +} \ No newline at end of file