Skip to content

Commit ebbeb84

Browse files
authored
Merge branch 'DaleStudy:main' into main
2 parents cc9a4d6 + a9c447d commit ebbeb84

97 files changed

Lines changed: 3858 additions & 39 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
/**
2+
* Definition for a binary tree node.
3+
* public class TreeNode {
4+
* int val;
5+
* TreeNode left;
6+
* TreeNode right;
7+
* TreeNode() {}
8+
* TreeNode(int val) { this.val = val; }
9+
* TreeNode(int val, TreeNode left, TreeNode right) {
10+
* this.val = val;
11+
* this.left = left;
12+
* this.right = right;
13+
* }
14+
* }
15+
*/
16+
class Solution {
17+
public List<List<Integer>> levelOrder(TreeNode root) {
18+
List<List<Integer>> answer = new ArrayList<>();
19+
Deque<Pair> queue = new ArrayDeque<>();
20+
int[] visit = new int[2000];
21+
if (root != null){
22+
queue.add(new Pair(root, 0));
23+
}
24+
25+
while (!queue.isEmpty()) {
26+
Pair cur = queue.poll();
27+
// System.out.println(cur.node.val+ " depth="+cur.depth);
28+
if (visit[cur.depth] == 0){
29+
answer.add(new ArrayList<>());
30+
visit[cur.depth] = 1;
31+
}
32+
List<Integer> ls = answer.get(cur.depth);
33+
ls.add(cur.node.val);
34+
35+
if (cur.node.left != null) queue.add(new Pair(cur.node.left, cur.depth + 1));
36+
if (cur.node.right != null) queue.add(new Pair(cur.node.right, cur.depth + 1));
37+
}
38+
return answer;
39+
}
40+
class Pair{
41+
TreeNode node;
42+
int depth;
43+
44+
public Pair(TreeNode node, int depth){
45+
this.node = node;
46+
this.depth = depth;
47+
}
48+
}
49+
}
50+
51+

clone-graph/8804who.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
"""
2+
# Definition for a Node.
3+
class Node:
4+
def __init__(self, val = 0, neighbors = None):
5+
self.val = val
6+
self.neighbors = neighbors if neighbors is not None else []
7+
"""
8+
9+
from typing import Optional
10+
11+
class Solution:
12+
def cloneGraph(self, node: Optional['Node']) -> Optional['Node']:
13+
if not node:
14+
return
15+
visited = {}
16+
new_node = Node()
17+
def dfs(original_node, new_node):
18+
if original_node.val in visited:
19+
return
20+
visited[original_node.val] = new_node
21+
new_node.val = original_node.val
22+
new_node.neighbors = []
23+
24+
for neighbor in original_node.neighbors:
25+
new_node.neighbors.append(Node())
26+
if neighbor.val not in visited:
27+
dfs(neighbor, new_node.neighbors[-1])
28+
new_node.neighbors[-1] = visited[neighbor.val]
29+
dfs(node, new_node)
30+
return new_node
31+
32+
33+

clone-graph/Blossssom.ts

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
class _Node {
2+
val: number;
3+
neighbors: _Node[];
4+
5+
constructor(val?: number, neighbors?: _Node[]) {
6+
this.val = val === undefined ? 0 : val;
7+
this.neighbors = neighbors === undefined ? [] : neighbors;
8+
}
9+
}
10+
11+
// 결국 새로운 인스턴스를 만들어 참조가 끊긴 완전한 남남의 그래프를 생성
12+
13+
function cloneGraph(node: _Node | null): _Node | null {
14+
if (!node) {
15+
return null;
16+
}
17+
18+
const visited = new Map<_Node, _Node>();
19+
20+
visited.set(node, new _Node(node.val));
21+
22+
const queue: _Node[] = [node];
23+
24+
while (queue.length > 0) {
25+
const currentNode = queue.shift()!;
26+
27+
for (const n of currentNode?.neighbors) {
28+
if (!visited.has(n)) {
29+
visited.set(n, new _Node(n.val));
30+
queue.push(n);
31+
}
32+
33+
visited.get(currentNode)!.neighbors.push(visited.get(n)!);
34+
}
35+
}
36+
37+
return null;
38+
}
39+
40+
// function cloneGraph(node: _Node | null): _Node | null {
41+
// if (!node) {
42+
// return null;
43+
// }
44+
45+
// const checkMap = new Map<number, _Node>();
46+
47+
// function dfs(targetNode: _Node) {
48+
// if (checkMap.has(targetNode.val)) {
49+
// return checkMap.get(targetNode.val)!;
50+
// }
51+
52+
// const newNode = new _Node(targetNode.val);
53+
// checkMap.set(targetNode.val, newNode);
54+
55+
// for (const n of targetNode.neighbors) {
56+
// newNode.neighbors.push(dfs(n));
57+
// }
58+
59+
// return newNode;
60+
// }
61+
62+
// const result = dfs(node);
63+
64+
// return result;
65+
// }
66+
67+
const node1 = new _Node(1);
68+
const node2 = new _Node(2);
69+
const node3 = new _Node(3);
70+
const node4 = new _Node(4);
71+
72+
node1.neighbors = [node2, node4];
73+
node2.neighbors = [node1, node3];
74+
node3.neighbors = [node2, node4];
75+
node4.neighbors = [node1, node3];
76+
77+
cloneGraph(node1);
78+
79+
80+

clone-graph/chjung99.java

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
/*
2+
// Definition for a Node.
3+
class Node {
4+
public int val;
5+
public List<Node> neighbors;
6+
public Node() {
7+
val = 0;
8+
neighbors = new ArrayList<Node>();
9+
}
10+
public Node(int _val) {
11+
val = _val;
12+
neighbors = new ArrayList<Node>();
13+
}
14+
public Node(int _val, ArrayList<Node> _neighbors) {
15+
val = _val;
16+
neighbors = _neighbors;
17+
}
18+
}
19+
*/
20+
21+
class Solution {
22+
public Node cloneGraph(Node node) {
23+
if (node == null) return node;
24+
return deepCopy(node);
25+
}
26+
27+
public Node deepCopy(Node node) {
28+
Deque<Node> deque = new ArrayDeque<>();
29+
Node root = new Node(node.val, new ArrayList<>());
30+
Map<Integer, Node> visit = new HashMap<>();
31+
32+
visit.put(1, root);
33+
deque.add(node);
34+
35+
while (!deque.isEmpty()) {
36+
Node cur = deque.poll();
37+
for (Node next: cur.neighbors) {
38+
if (!visit.containsKey(next.val)){
39+
visit.put(next.val, new Node(next.val, new ArrayList<>()));
40+
deque.add(next);
41+
}
42+
visit.get(cur.val).neighbors.add(visit.get(next.val));
43+
}
44+
}
45+
return root;
46+
}
47+
}
48+
49+

clone-graph/haxr369.java

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
import java.util.ArrayList;
2+
import java.util.List;
3+
4+
/**
5+
* Runtime: 25 ms (Beats 72.12%)
6+
* Memory: 44.35 MB (Beats 34.32%)
7+
* Space Complexity: O(N)
8+
* - 모든 노드 저장 => O(N)
9+
* - visited로 복사했던 노드 관리 => O(N)
10+
* > O(N)
11+
* Time Complexity: O(N)
12+
* - 루트노드부터 모든 노드까지 한번씩 탐색 => O(N)
13+
* > O(N)
14+
*
15+
*/
16+
17+
class Node {
18+
public int val;
19+
public List<Node> neighbors;
20+
21+
public Node() {
22+
val = 0;
23+
neighbors = new ArrayList<Node>();
24+
}
25+
26+
public Node(int _val) {
27+
val = _val;
28+
neighbors = new ArrayList<Node>();
29+
}
30+
31+
public Node(int _val, ArrayList<Node> _neighbors) {
32+
val = _val;
33+
neighbors = _neighbors;
34+
}
35+
}
36+
37+
class Solution {
38+
public Node cloneGraph(Node node) {
39+
if (node == null) {
40+
return node;
41+
}
42+
43+
if (node.neighbors == null) {
44+
Node newNode = new Node(node.val, null);
45+
return newNode;
46+
} else if (node.neighbors.isEmpty()) {
47+
Node newNode = new Node(node.val, new ArrayList<>());
48+
return newNode;
49+
}
50+
51+
Node[] visited = new Node[104];
52+
53+
Node ans = new Node(node.val, new ArrayList<>(node.neighbors));
54+
visited[ans.val] = ans;
55+
dfs(ans, visited);
56+
57+
return ans;
58+
}
59+
60+
/**
61+
* node의 리스트를 dfs로 변경해간다.
62+
* 다만, 변경했던 노드는 다시 변경하지 않음
63+
*/
64+
private void dfs(Node node, Node[] visited) {
65+
66+
List<Node> neighbors = node.neighbors; // 이전 것
67+
68+
List<Node> newNeighbors = new ArrayList<>(); // 새 껍질
69+
// 하나씩 새걸로 바꾸자
70+
for (Node n : neighbors) {
71+
if (visited[n.val] != null) {
72+
newNeighbors.add(visited[n.val]);
73+
continue;
74+
}
75+
Node newN = new Node(n.val, new ArrayList<>(n.neighbors)); // 껍질 만들기
76+
visited[newN.val] = newN;
77+
dfs(newN, visited); //
78+
newNeighbors.add(newN);
79+
}
80+
node.neighbors = newNeighbors; // 신규 리스트로 바꿔치기
81+
// printNode(node);
82+
}
83+
84+
private void printNode(Node node) {
85+
System.out.print("val -> " + node.val);
86+
System.out.println(" size -> " + node.neighbors.size());
87+
node.neighbors.forEach(n -> System.out.print(n.val));
88+
System.out.print('\n');
89+
}
90+
}

clone-graph/imgolden77.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
"""
2+
# Definition for a Node.
3+
class Node:
4+
def __init__(self, val = 0, neighbors = None):
5+
self.val = val
6+
self.neighbors = neighbors if neighbors is not None else []
7+
"""
8+
9+
from typing import Optional
10+
class Solution:
11+
def cloneGraph(self, node: Optional['Node']) -> Optional['Node']:
12+
if not node:
13+
return None
14+
old_to_new = {}
15+
16+
def dfs(curr_node):
17+
if curr_node in old_to_new:
18+
return old_to_new[curr_node]
19+
20+
copy = Node(curr_node.val)
21+
old_to_new[curr_node] = copy
22+
23+
for neighbors in curr_node.neighbors:
24+
copy.neighbors.append(dfs(neighbors))
25+
26+
return copy
27+
28+
return dfs(node)
29+
30+
# O(N+E) time complexity where N is the number of nodes and E is the number of edges in the graph.
31+
# O(N) space complexity for the hashmap and the recursion stack in the worst case.
32+
33+

clone-graph/ys-han00.cpp

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
/*
2+
// Definition for a Node.
3+
class Node {
4+
public:
5+
int val;
6+
vector<Node*> neighbors;
7+
Node() {
8+
val = 0;
9+
neighbors = vector<Node*>();
10+
}
11+
Node(int _val) {
12+
val = _val;
13+
neighbors = vector<Node*>();
14+
}
15+
Node(int _val, vector<Node*> _neighbors) {
16+
val = _val;
17+
neighbors = _neighbors;
18+
}
19+
};
20+
*/
21+
22+
class Solution {
23+
public:
24+
Node* cloneGraph(Node* node) {
25+
if(!node)
26+
return nullptr;
27+
28+
29+
Node* clone = new Node(node->val);
30+
map<Node*, Node*> clones;
31+
queue<Node*> que;
32+
33+
clones[node] = clone;
34+
que.push(node);
35+
36+
while(!que.empty()) {
37+
node = que.front();
38+
que.pop();
39+
40+
for(auto neigh : node->neighbors) {
41+
if(clones.find(neigh) == clones.end()) {
42+
que.push(neigh);
43+
clones[neigh] = new Node(neigh->val);
44+
}
45+
clones[node]->neighbors.push_back(clones[neigh]);
46+
}
47+
}
48+
49+
return clone;
50+
}
51+
};
52+

0 commit comments

Comments
 (0)