2023-07-12 Daily Challenge
Today I have done leetcode's July LeetCoding Challenge with cpp
.
July LeetCoding Challenge 12
Description
Find Eventual Safe States
There is a directed graph of n
nodes with each node labeled from 0
to n - 1
. The graph is represented by a 0-indexed 2D integer array graph
where graph[i]
is an integer array of nodes adjacent to node i
, meaning there is an edge from node i
to each node in graph[i]
.
A node is a terminal node if there are no outgoing edges. A node is a safe node if every possible path starting from that node leads to a terminal node (or another safe node).
Return an array containing all the safe nodes of the graph. The answer should be sorted in ascending order.
Example 1:
Input: graph = [[1,2],[2,3],[5],[0],[5],[],[]] Output: [2,4,5,6] Explanation: The given graph is shown above. Nodes 5 and 6 are terminal nodes as there are no outgoing edges from either of them. Every path starting at nodes 2, 4, 5, and 6 all lead to either node 5 or 6.
Example 2:
Input: graph = [[1,2,3,4],[1,2],[3,4],[0,4],[]] Output: [4] Explanation: Only node 4 is a terminal node, and every path starting at node 4 leads to node 4.
Constraints:
n == graph.length
1 <= n <= 104
0 <= graph[i].length <= n
0 <= graph[i][j] <= n - 1
graph[i]
is sorted in a strictly increasing order.- The graph may contain self-loops.
- The number of edges in the graph will be in the range
[1, 4 * 104]
.
Solution
auto speedup = [](){
cin.tie(nullptr);
cout.tie(nullptr);
ios::sync_with_stdio(false);
return 0;
}();
class Solution {
public:
vector<int> eventualSafeNodes(vector<vector<int>>& graph) {
int len = graph.size();
vector<vector<int>> reverseGraph(len);
vector<int> degree(len);
for(int i = 0; i < len; ++i) {
for(auto next : graph[i]) {
reverseGraph[next].push_back(i);
degree[i] += 1;
}
}
queue<int> q;
vector<int> answer;
for(int i = 0; i < len; ++i) {
if(!degree[i]) {
q.push(i);
}
}
while(q.size()) {
int current = q.front();
q.pop();
answer.push_back(current);
for(auto next : reverseGraph[current]) {
degree[next] -= 1;
if(!degree[next]) {
q.push(next);
}
}
}
sort(answer.begin(), answer.end());
return answer;
}
};
// Accepted
// 112/112 cases passed (215 ms)
// Your runtime beats 51.35 % of cpp submissions
// Your memory usage beats 22.44 % of cpp submissions (61.5 MB)