The next problem in the current coding spree was:
Problem Name: Course Schedule
Problem Description: https://leetcode.com/problems/course-schedule/
Problem Approach used: Detecting cycles on the directed graph pf dependencies using DFS to solve in O(V+E) where V is the number of courses in the input and E is the number of edges between them.
Time Complexity: O(lg n) worst-case time and O(1) auxiliary space complexity
Java Solution:
//Cycle detection // package com.projects.cv.course_schedule; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; class Solution { // private static Logger logger = Logger.getLogger("MyLogger"); int nodes; public boolean canFinish(int numCourses, int[][] prerequisites) { if (prerequisites == null) return false; int pL = prerequisites.length; nodes = numCourses; // Build directed graph Map<Integer, List<Integer>> g = new HashMap<>(); for (int i=0; i<pL; i++) { if (!g.containsKey(prerequisites[i][0])) g.put(prerequisites[i][0], new ArrayList<>()); g.get(prerequisites[i][0]).add(prerequisites[i][1]); } System.out.println(g); //Create visited to prevent re-visiting int visited[] = new int[numCourses]; for (int i=0; i<numCourses; i++) { if (visited[i] == 0) { if (hasCycleDfs(g, visited, i, -1)) return false; } } return true; } private boolean hasCycleDfs( Map<Integer, List<Integer>> g, int[] visited, int n, int parent) { if (visited[n] == -1) { //current exploration path System.out.println("cycle found at u(" + parent + ")->v(" + n + ")"); return true; } if (visited[n] == 1) { return false; } visited[n] = -1; if (g.get(n) == null) { // tackle bad callers visited[n] = 1; return false; } for (int neighBr : g.get(n)) { if (hasCycleDfs(g, visited, neighBr, n)) return true; } visited[n] = 1; return false; } // public static void main(String[] args) { // Solution s = new Solution(); // int[][] deps = {{1, 0}}; // s.canFinish(2, deps); // } }
Love! ❤️
#Lets #Code
Follow us on :