给你一个下标从 0 开始的二维整数数组 pairs ,其中 pairs[i] = [starti, endi] 。如果 pairs 的一个重新排列,满足对每一个下标 i ( 1 <= i < pairs.length )都有 endi-1 == starti ,那么我们就认为这个重新排列是 pairs 的一个 合法重新排列 。
请你返回 任意一个 pairs 的合法重新排列。
注意:数据保证至少存在一个 pairs 的合法重新排列。
思路分析入度为2时,从出度为1的结点开始,入度为0任选结点逆向输出各结点
circuit保存当前走到死胡同的一组连接的结点
curr_path的top就是当前可以继续展开bfs搜索的当前主线的结尾结点
堆栈写法代码如下
class Solution { public: vectorprintCircuit(int curr,map > adj){ // adj represents the adjacency list of // the directed graph // edge_count represents the number of edges // emerging from a vertex unordered_map edge_count; for (auto &i:adj) //find the count of edges to keep track //of unused edges edge_count[i.first] = i.second.size(); //对应下标取边数 // Maintain a stack to keep vertices stack curr_path; // vector to store final circuit vector circuit; // start from any vertex curr_path.push(curr); int curr_v = curr; // Current vertex while (!curr_path.empty()) { // If there's remaining edge if (edge_count[curr_v]){ // Push the vertex curr_path.push(curr_v); // Find the next vertex using an edge int next_v = adj[curr_v].back(); //每次从最后一个元素取(考虑时间复杂度) // and remove that edge edge_count[curr_v]--; adj[curr_v].pop_back(); // Move to next vertex curr_v = next_v; } // back-track to find remaining circuit else //到最后也会重复执行这一过程 { circuit.push_back(curr_v); //保留在回路中 // Back-tracking curr_v = curr_path.top(); //获取当前元素 curr_path.pop(); //还要退栈 } } reverse(circuit.begin(),circuit.end()); return circuit; } vector > validArrangement(vector >& pairs) { map > adj; map > mp; //统计所有点的入度和出度 int curr=pairs[0][0]; for(auto &t:pairs){ adj[t[0]].push_back(t[1]); mp[t[0]].second++; mp[t[1]].first++; } for(auto &t:mp) if((t.second.second-t.second.first)==1) curr=t.first; vector c=printCircuit(curr,adj); vector > p; for(int i=0;i dfs方法如下,但容易爆栈 class Solution { public: vector> validArrangement(vector >& pairs) { map > adj; map > mp; //统计所有点的入度和出度 int curr=pairs[0][0]; for(auto &t:pairs){ adj[t[0]].push_back(t[1]); mp[t[0]].second++; mp[t[1]].first++; } for(auto &t:mp) if((t.second.second-t.second.first)==1) curr=t.first; vector > p; function dfs = [&](int u) { while (!adj[u].empty()) { int v = adj[u].back(); adj[u].pop_back(); dfs(v); p.push_back({u, v}); //相当于之后的 } }; dfs(curr); reverse(p.begin(),p.end()); return p; } }; 欢迎分享,转载请注明来源:内存溢出
评论列表(0条)