Skip to content

Commit 3120cfe

Browse files
authored
feat: add solutions to lc problem: No.3311 (doocs#3607)
No.3311.Construct 2D Grid Matching Graph Layout
1 parent a0d941e commit 3120cfe

File tree

7 files changed

+980
-6
lines changed

7 files changed

+980
-6
lines changed

solution/3300-3399/3311.Construct 2D Grid Matching Graph Layout/README.md

+328-3
Original file line numberDiff line numberDiff line change
@@ -92,25 +92,350 @@ edit_url: https://github.com/doocs/leetcode/edit/main/solution/3300-3399/3311.Co
9292
#### Python3
9393

9494
```python
95-
95+
class Solution:
96+
def constructGridLayout(self, n: int, edges: List[List[int]]) -> List[List[int]]:
97+
g = [[] for _ in range(n)]
98+
for u, v in edges:
99+
g[u].append(v)
100+
g[v].append(u)
101+
deg = [-1] * 5
102+
for x, ys in enumerate(g):
103+
deg[len(ys)] = x
104+
if deg[1] != -1:
105+
row = [deg[1]]
106+
elif deg[4] == -1:
107+
x = deg[2]
108+
for y in g[x]:
109+
if len(g[y]) == 2:
110+
row = [x, y]
111+
break
112+
else:
113+
x = deg[2]
114+
row = [x]
115+
pre = x
116+
x = g[x][0]
117+
while len(g[x]) > 2:
118+
row.append(x)
119+
for y in g[x]:
120+
if y != pre and len(g[y]) < 4:
121+
pre = x
122+
x = y
123+
break
124+
row.append(x)
125+
126+
ans = [row]
127+
vis = [False] * n
128+
for _ in range(n // len(row) - 1):
129+
for x in row:
130+
vis[x] = True
131+
nxt = []
132+
for x in row:
133+
for y in g[x]:
134+
if not vis[y]:
135+
nxt.append(y)
136+
break
137+
ans.append(nxt)
138+
row = nxt
139+
return ans
96140
```
97141

98142
#### Java
99143

100144
```java
101-
145+
class Solution {
146+
public int[][] constructGridLayout(int n, int[][] edges) {
147+
List<Integer>[] g = new List[n];
148+
Arrays.setAll(g, k -> new ArrayList<>());
149+
for (int[] e : edges) {
150+
int u = e[0], v = e[1];
151+
g[u].add(v);
152+
g[v].add(u);
153+
}
154+
155+
int[] deg = new int[5];
156+
Arrays.fill(deg, -1);
157+
158+
for (int x = 0; x < n; x++) {
159+
deg[g[x].size()] = x;
160+
}
161+
162+
List<Integer> row = new ArrayList<>();
163+
if (deg[1] != -1) {
164+
row.add(deg[1]);
165+
} else if (deg[4] == -1) {
166+
int x = deg[2];
167+
for (int y : g[x]) {
168+
if (g[y].size() == 2) {
169+
row.add(x);
170+
row.add(y);
171+
break;
172+
}
173+
}
174+
} else {
175+
int x = deg[2];
176+
row.add(x);
177+
int pre = x;
178+
x = g[x].get(0);
179+
while (g[x].size() > 2) {
180+
row.add(x);
181+
for (int y : g[x]) {
182+
if (y != pre && g[y].size() < 4) {
183+
pre = x;
184+
x = y;
185+
break;
186+
}
187+
}
188+
}
189+
row.add(x);
190+
}
191+
192+
List<List<Integer>> res = new ArrayList<>();
193+
res.add(new ArrayList<>(row));
194+
195+
boolean[] vis = new boolean[n];
196+
int rowSize = row.size();
197+
for (int i = 0; i < n / rowSize - 1; i++) {
198+
for (int x : row) {
199+
vis[x] = true;
200+
}
201+
List<Integer> nxt = new ArrayList<>();
202+
for (int x : row) {
203+
for (int y : g[x]) {
204+
if (!vis[y]) {
205+
nxt.add(y);
206+
break;
207+
}
208+
}
209+
}
210+
res.add(new ArrayList<>(nxt));
211+
row = nxt;
212+
}
213+
214+
int[][] ans = new int[res.size()][rowSize];
215+
for (int i = 0; i < res.size(); i++) {
216+
for (int j = 0; j < rowSize; j++) {
217+
ans[i][j] = res.get(i).get(j);
218+
}
219+
}
220+
return ans;
221+
}
222+
}
102223
```
103224

104225
#### C++
105226

106227
```cpp
107-
228+
class Solution {
229+
public:
230+
vector<vector<int>> constructGridLayout(int n, vector<vector<int>>& edges) {
231+
vector<vector<int>> g(n);
232+
for (auto& e : edges) {
233+
int u = e[0], v = e[1];
234+
g[u].push_back(v);
235+
g[v].push_back(u);
236+
}
237+
238+
vector<int> deg(5, -1);
239+
for (int x = 0; x < n; ++x) {
240+
deg[g[x].size()] = x;
241+
}
242+
243+
vector<int> row;
244+
if (deg[1] != -1) {
245+
row.push_back(deg[1]);
246+
} else if (deg[4] == -1) {
247+
int x = deg[2];
248+
for (int y : g[x]) {
249+
if (g[y].size() == 2) {
250+
row.push_back(x);
251+
row.push_back(y);
252+
break;
253+
}
254+
}
255+
} else {
256+
int x = deg[2];
257+
row.push_back(x);
258+
int pre = x;
259+
x = g[x][0];
260+
while (g[x].size() > 2) {
261+
row.push_back(x);
262+
for (int y : g[x]) {
263+
if (y != pre && g[y].size() < 4) {
264+
pre = x;
265+
x = y;
266+
break;
267+
}
268+
}
269+
}
270+
row.push_back(x);
271+
}
272+
273+
vector<vector<int>> ans;
274+
ans.push_back(row);
275+
vector<bool> vis(n, false);
276+
int rowSize = row.size();
277+
for (int i = 0; i < n / rowSize - 1; ++i) {
278+
for (int x : row) {
279+
vis[x] = true;
280+
}
281+
vector<int> nxt;
282+
for (int x : row) {
283+
for (int y : g[x]) {
284+
if (!vis[y]) {
285+
nxt.push_back(y);
286+
break;
287+
}
288+
}
289+
}
290+
ans.push_back(nxt);
291+
row = nxt;
292+
}
293+
294+
return ans;
295+
}
296+
};
108297
```
109298

110299
#### Go
111300

112301
```go
302+
func constructGridLayout(n int, edges [][]int) [][]int {
303+
g := make([][]int, n)
304+
for _, e := range edges {
305+
u, v := e[0], e[1]
306+
g[u] = append(g[u], v)
307+
g[v] = append(g[v], u)
308+
}
309+
310+
deg := make([]int, 5)
311+
for i := range deg {
312+
deg[i] = -1
313+
}
314+
315+
for x := 0; x < n; x++ {
316+
deg[len(g[x])] = x
317+
}
318+
319+
var row []int
320+
if deg[1] != -1 {
321+
row = append(row, deg[1])
322+
} else if deg[4] == -1 {
323+
x := deg[2]
324+
for _, y := range g[x] {
325+
if len(g[y]) == 2 {
326+
row = append(row, x, y)
327+
break
328+
}
329+
}
330+
} else {
331+
x := deg[2]
332+
row = append(row, x)
333+
pre := x
334+
x = g[x][0]
335+
for len(g[x]) > 2 {
336+
row = append(row, x)
337+
for _, y := range g[x] {
338+
if y != pre && len(g[y]) < 4 {
339+
pre = x
340+
x = y
341+
break
342+
}
343+
}
344+
}
345+
row = append(row, x)
346+
}
347+
348+
ans := [][]int{row}
349+
vis := make([]bool, n)
350+
rowSize := len(row)
351+
for i := 0; i < n/rowSize-1; i++ {
352+
for _, x := range row {
353+
vis[x] = true
354+
}
355+
nxt := []int{}
356+
for _, x := range row {
357+
for _, y := range g[x] {
358+
if !vis[y] {
359+
nxt = append(nxt, y)
360+
break
361+
}
362+
}
363+
}
364+
ans = append(ans, nxt)
365+
row = nxt
366+
}
367+
368+
return ans
369+
}
370+
```
113371

372+
#### TypeScript
373+
374+
```ts
375+
function constructGridLayout(n: number, edges: number[][]): number[][] {
376+
const g: number[][] = Array.from({ length: n }, () => []);
377+
for (const [u, v] of edges) {
378+
g[u].push(v);
379+
g[v].push(u);
380+
}
381+
382+
const deg: number[] = Array(5).fill(-1);
383+
for (let x = 0; x < n; x++) {
384+
deg[g[x].length] = x;
385+
}
386+
387+
let row: number[] = [];
388+
if (deg[1] !== -1) {
389+
row.push(deg[1]);
390+
} else if (deg[4] === -1) {
391+
let x = deg[2];
392+
for (const y of g[x]) {
393+
if (g[y].length === 2) {
394+
row.push(x, y);
395+
break;
396+
}
397+
}
398+
} else {
399+
let x = deg[2];
400+
row.push(x);
401+
let pre = x;
402+
x = g[x][0];
403+
while (g[x].length > 2) {
404+
row.push(x);
405+
for (const y of g[x]) {
406+
if (y !== pre && g[y].length < 4) {
407+
pre = x;
408+
x = y;
409+
break;
410+
}
411+
}
412+
}
413+
row.push(x);
414+
}
415+
416+
const ans: number[][] = [row];
417+
const vis: boolean[] = Array(n).fill(false);
418+
const rowSize = row.length;
419+
420+
for (let i = 0; i < Math.floor(n / rowSize) - 1; i++) {
421+
for (const x of row) {
422+
vis[x] = true;
423+
}
424+
const nxt: number[] = [];
425+
for (const x of row) {
426+
for (const y of g[x]) {
427+
if (!vis[y]) {
428+
nxt.push(y);
429+
break;
430+
}
431+
}
432+
}
433+
ans.push(nxt);
434+
row = nxt;
435+
}
436+
437+
return ans;
438+
}
114439
```
115440

116441
<!-- tabs:end -->

0 commit comments

Comments
 (0)