Welcome to Subscribe On Youtube
3311. Construct 2D Grid Matching Graph Layout
Description
You are given a 2D integer array edges
representing an undirected graph having n
nodes, where edges[i] = [ui, vi]
denotes an edge between nodes ui
and vi
.
Construct a 2D grid that satisfies these conditions:
- The grid contains all nodes from
0
ton - 1
in its cells, with each node appearing exactly once. - Two nodes should be in adjacent grid cells (horizontally or vertically) if and only if there is an edge between them in
edges
.
It is guaranteed that edges
can form a 2D grid that satisfies the conditions.
Return a 2D integer array satisfying the conditions above. If there are multiple solutions, return any of them.
Example 1:
Input: n = 4, edges = [[0,1],[0,2],[1,3],[2,3]]
Output: [[3,1],[2,0]]
Explanation:
Example 2:
Input: n = 5, edges = [[0,1],[1,3],[2,3],[2,4]]
Output: [[4,2,3,1,0]]
Explanation:
Example 3:
Input: n = 9, edges = [[0,1],[0,4],[0,5],[1,7],[2,3],[2,4],[2,5],[3,6],[4,6],[4,7],[6,8],[7,8]]
Output: [[8,6,3],[7,4,2],[1,0,5]]
Explanation:
Constraints:
2 <= n <= 5 * 104
1 <= edges.length <= 105
edges[i] = [ui, vi]
0 <= ui < vi < n
- All the edges are distinct.
- The input is generated such that
edges
can form a 2D grid that satisfies the conditions.
Solutions
Solution 1
-
class Solution { public int[][] constructGridLayout(int n, int[][] edges) { List<Integer>[] g = new List[n]; Arrays.setAll(g, k -> new ArrayList<>()); for (int[] e : edges) { int u = e[0], v = e[1]; g[u].add(v); g[v].add(u); } int[] deg = new int[5]; Arrays.fill(deg, -1); for (int x = 0; x < n; x++) { deg[g[x].size()] = x; } List<Integer> row = new ArrayList<>(); if (deg[1] != -1) { row.add(deg[1]); } else if (deg[4] == -1) { int x = deg[2]; for (int y : g[x]) { if (g[y].size() == 2) { row.add(x); row.add(y); break; } } } else { int x = deg[2]; row.add(x); int pre = x; x = g[x].get(0); while (g[x].size() > 2) { row.add(x); for (int y : g[x]) { if (y != pre && g[y].size() < 4) { pre = x; x = y; break; } } } row.add(x); } List<List<Integer>> res = new ArrayList<>(); res.add(new ArrayList<>(row)); boolean[] vis = new boolean[n]; int rowSize = row.size(); for (int i = 0; i < n / rowSize - 1; i++) { for (int x : row) { vis[x] = true; } List<Integer> nxt = new ArrayList<>(); for (int x : row) { for (int y : g[x]) { if (!vis[y]) { nxt.add(y); break; } } } res.add(new ArrayList<>(nxt)); row = nxt; } int[][] ans = new int[res.size()][rowSize]; for (int i = 0; i < res.size(); i++) { for (int j = 0; j < rowSize; j++) { ans[i][j] = res.get(i).get(j); } } return ans; } }
-
class Solution { public: vector<vector<int>> constructGridLayout(int n, vector<vector<int>>& edges) { vector<vector<int>> g(n); for (auto& e : edges) { int u = e[0], v = e[1]; g[u].push_back(v); g[v].push_back(u); } vector<int> deg(5, -1); for (int x = 0; x < n; ++x) { deg[g[x].size()] = x; } vector<int> row; if (deg[1] != -1) { row.push_back(deg[1]); } else if (deg[4] == -1) { int x = deg[2]; for (int y : g[x]) { if (g[y].size() == 2) { row.push_back(x); row.push_back(y); break; } } } else { int x = deg[2]; row.push_back(x); int pre = x; x = g[x][0]; while (g[x].size() > 2) { row.push_back(x); for (int y : g[x]) { if (y != pre && g[y].size() < 4) { pre = x; x = y; break; } } } row.push_back(x); } vector<vector<int>> ans; ans.push_back(row); vector<bool> vis(n, false); int rowSize = row.size(); for (int i = 0; i < n / rowSize - 1; ++i) { for (int x : row) { vis[x] = true; } vector<int> nxt; for (int x : row) { for (int y : g[x]) { if (!vis[y]) { nxt.push_back(y); break; } } } ans.push_back(nxt); row = nxt; } return ans; } };
-
class Solution: def constructGridLayout(self, n: int, edges: List[List[int]]) -> List[List[int]]: g = [[] for _ in range(n)] for u, v in edges: g[u].append(v) g[v].append(u) deg = [-1] * 5 for x, ys in enumerate(g): deg[len(ys)] = x if deg[1] != -1: row = [deg[1]] elif deg[4] == -1: x = deg[2] for y in g[x]: if len(g[y]) == 2: row = [x, y] break else: x = deg[2] row = [x] pre = x x = g[x][0] while len(g[x]) > 2: row.append(x) for y in g[x]: if y != pre and len(g[y]) < 4: pre = x x = y break row.append(x) ans = [row] vis = [False] * n for _ in range(n // len(row) - 1): for x in row: vis[x] = True nxt = [] for x in row: for y in g[x]: if not vis[y]: nxt.append(y) break ans.append(nxt) row = nxt return ans
-
func constructGridLayout(n int, edges [][]int) [][]int { g := make([][]int, n) for _, e := range edges { u, v := e[0], e[1] g[u] = append(g[u], v) g[v] = append(g[v], u) } deg := make([]int, 5) for i := range deg { deg[i] = -1 } for x := 0; x < n; x++ { deg[len(g[x])] = x } var row []int if deg[1] != -1 { row = append(row, deg[1]) } else if deg[4] == -1 { x := deg[2] for _, y := range g[x] { if len(g[y]) == 2 { row = append(row, x, y) break } } } else { x := deg[2] row = append(row, x) pre := x x = g[x][0] for len(g[x]) > 2 { row = append(row, x) for _, y := range g[x] { if y != pre && len(g[y]) < 4 { pre = x x = y break } } } row = append(row, x) } ans := [][]int{row} vis := make([]bool, n) rowSize := len(row) for i := 0; i < n/rowSize-1; i++ { for _, x := range row { vis[x] = true } nxt := []int{} for _, x := range row { for _, y := range g[x] { if !vis[y] { nxt = append(nxt, y) break } } } ans = append(ans, nxt) row = nxt } return ans }
-
function constructGridLayout(n: number, edges: number[][]): number[][] { const g: number[][] = Array.from({ length: n }, () => []); for (const [u, v] of edges) { g[u].push(v); g[v].push(u); } const deg: number[] = Array(5).fill(-1); for (let x = 0; x < n; x++) { deg[g[x].length] = x; } let row: number[] = []; if (deg[1] !== -1) { row.push(deg[1]); } else if (deg[4] === -1) { let x = deg[2]; for (const y of g[x]) { if (g[y].length === 2) { row.push(x, y); break; } } } else { let x = deg[2]; row.push(x); let pre = x; x = g[x][0]; while (g[x].length > 2) { row.push(x); for (const y of g[x]) { if (y !== pre && g[y].length < 4) { pre = x; x = y; break; } } } row.push(x); } const ans: number[][] = [row]; const vis: boolean[] = Array(n).fill(false); const rowSize = row.length; for (let i = 0; i < Math.floor(n / rowSize) - 1; i++) { for (const x of row) { vis[x] = true; } const nxt: number[] = []; for (const x of row) { for (const y of g[x]) { if (!vis[y]) { nxt.push(y); break; } } } ans.push(nxt); row = nxt; } return ans; }