1. Exhaustive Permutation Search
Intuition
Generate permutations of [0, 1, ..., numCourses - 1] and verify if all prerequisite dependencies are respected.
Algorithm
- Generate all permutations of numbers
0tonumCourses - 1. - For each permutation, record the position index of each course.
- Check every prerequisite
[a, b]: ifpos[b] > pos[a], invalid permutation. - If a permutation satisfies all prerequisites, return it.
- If all permutations are tested without success, return
[].
#include <iostream>#include <vector>#include <numeric>#include <algorithm> class Solution { bool isValid(const std::vector<int>& order, const std::vector<std::vector<int>>& prerequisites, int n) { std::vector<int> pos(n); for (int i = 0; i < n; ++i) pos[order[i]] = i; for (const auto& p : prerequisites) { if (pos[p[1]] > pos[p[0]]) return false; } return true; }public: std::vector<int> findOrder(int numCourses, std::vector<std::vector<int>>& prerequisites) { std::vector<int> order(numCourses); std::iota(order.begin(), order.end(), 0); do { if (isValid(order, prerequisites, numCourses)) return order; } while (std::next_permutation(order.begin(), order.end())); return {}; }}; int main() { Solution sol; std::vector<std::vector<int>> p = {{1, 0}}; auto res = sol.findOrder(2, p); std::cout << "Order: [" << res[0] << ", " << res[1] << "] (Expected: [0, 1])\n"; return 0;}Time & Space Complexity
- Time complexity:
O(N! * E) - Space complexity:
O(N)