2392 - Build a Matrix With Conditions
JAVA
class Solution {
List<Integer>[] al;
public int[][] buildMatrix(int k, int[][] rc, int[][] cc) {
int ans[][] = new int[k][k];
this.al = new ArrayList[k+1];
for(int i=0;i<=k;i++) al[i] = new ArrayList<>();
for(int r[] : rc) al[r[0]].add(r[1]);
boolean[] vis = new boolean[k+1];
boolean dfsvis[] = new boolean[k+1];
List<Integer> rowStack = new ArrayList<>();
for(int node=1;node<=k;node++){
if(!vis[node]) {
if(!dfs(node,vis,rowStack,dfsvis)) return new int[0][0];
}
}
for(int i=0;i<=k;i++) al[i] = new ArrayList<>();
for(int c[] : cc) al[c[0]].add(c[1]);
List<Integer> colStack = new ArrayList<>();
vis = new boolean[k+1];
dfsvis = new boolean[k+1];
for(int node=1;node<=k;node++){
if(!vis[node]) {
if(!dfs(node,vis,colStack,dfsvis)) return new int[0][0];
}
}
HashMap<Integer,Integer> map = new HashMap<>();
for(int i=0;i<colStack.size();i++){
map.put(colStack.get(i),i);
}
int row = 0;
for(int i=rowStack.size()-1;i>=0;i--){
ans[row++][k-map.get(rowStack.get(i))-1] = rowStack.get(i);
}
return ans;
}
private boolean dfs(int node,boolean[] vis,List<Integer> stack,boolean[] dfsvis){
vis[node] = true;
dfsvis[node] = true;
for(int next : al[node]){
if(!vis[next]) {
if(!dfs(next,vis,stack,dfsvis)) return false;
}else if(dfsvis[next]) return false;
}
stack.add(node);
dfsvis[node] = false;
return true;
}
}C++
class Solution { public: int k; vector<vector<int>> buildMatrix(int k, vector<vector<int>>& rowConditions, vector<vector<int>>& colConditions) { this->k = k; auto row = f(rowConditions); auto col = f(colConditions); if (row.empty() || col.empty()) return {}; vector<vector<int>> ans(k, vector<int>(k)); vector<int> m(k + 1); for (int i = 0; i < k; ++i) { m[col[i]] = i; } for (int i = 0; i < k; ++i) { ans[i][m[row[i]]] = row[i]; } return ans; } vector<int> f(vector<vector<int>>& cond) { vector<vector<int>> g(k + 1); vector<int> indeg(k + 1); for (auto& e : cond) { int a = e[0], b = e[1]; g[a].push_back(b); ++indeg[b]; } queue<int> q; for (int i = 1; i < k + 1; ++i) { if (!indeg[i]) { q.push(i); } } vector<int> res; while (!q.empty()) { for (int n = q.size(); n; --n) { int i = q.front(); res.push_back(i); q.pop(); for (int j : g[i]) { if (--indeg[j] == 0) { q.push(j); } } } } return res.size() == k ? res : vector<int>(); } };
Comments
Post a Comment