[알고리즘 학습] 복잡 한 링크 복사
해법 1: "폭파"
해법 분석: 1. 첫 번 째 배열 을 옮 겨 다 니 며 복제 체인 의 next 와 각 노드 값 을 복사 합 니 다.시간 이 필요 합 니 다 O (n) 2. 두 번 째 로 옮 겨 다 니 며 이중 for 순환 은 원 링크 에 따라 복사 체인 의 slibing 지침 을 연결 합 니 다.소요 시간 O (n ^ 2) 3. 소요 시간 복잡 도 는 O (n ^ 2), 공간 복잡 도 는 O (1)
참조 코드 는 다음 과 같 습 니 다.
/** * * * @author kesar * */
static class Node
{
int val;
Node next;
Node slibing;
public Node(){}
public Node(int val)
{
this.val = val;
}
@Override
public String toString()
{
return "Node [val=" + val + "]";
}
}
/** * : 。 next , slibing 。 :O(n^2), :O(1) * * @param oHead * @return */
public static Node copy1(Node oHead)
{
if (oHead == null)
{
return null;
}
//
Node cHead = new Node(oHead.val);
// oMove ,cMove
// Node next
for (Node oMove = oHead.next, cMove = cHead; oMove != null; cMove = cMove.next, oMove = oMove.next)
{
cMove.next = new Node(oMove.val);
}
// slibing
for (Node oMove = oHead, cMove = cHead; oMove != null; cMove = cMove.next, oMove = oMove.next)
{
if (oMove.slibing == null)
continue;
// : slibing copy
Node findNode = cHead;
for (; findNode != null && findNode.val != oMove.slibing.val; findNode = findNode.next)
;
// :findNode
cMove.slibing = findNode;
}
return cHead;
}
해법 2: 보조 공간 사용
해법 분석: 1. HashMap (Key: 원래 링크 의 결산 점, Value: 링크 의 결산 점 복사) 을 사용 합 니 다. 공간 복잡 도 는 O (n) 2 입 니 다. 첫 번 째 배열 을 옮 겨 다 닙 니 다. 복사 체인 의 결산 점 을 만 들 때마다 HashMap 에 결산 점 이 존재 하 는 지, 존재 하지 않 는 지 찾 아서 만 든 다음 에 결산 점 을 HashMap 에 저장 해 야 합 니 다.소요 시간 O (n) 4. 소요 시간 복잡 도 는 O (n), 공간 복잡 도 는 O (n)
참조 코드 는 다음 과 같 습 니 다.
/** * : HashMap O(1) for 。 O(n) O(n) 。 O(n), :O(n) * * @param oHead * @return */
public static Node copy2(Node oHead)
{
if (oHead == null)
{
return null;
}
// :Key: ,Value:
HashMap<Node, Node> map = new HashMap<Node, Node>();
//
Node cHead = new Node(oHead.val);
map.put(oHead, cHead);
if (oHead.slibing != null)
{
cHead.slibing = new Node(oHead.slibing.val);
map.put(oHead.slibing, cHead.slibing);
}
// : , 。
// : map , , , , put map ,
for (Node oMove = oHead.next, cMove = cHead; oMove != null; oMove = oMove.next, cMove = cMove.next)
{
if (map.containsKey(oMove))
{
cMove.next = map.get(oMove);
}
else
{
cMove.next = new Node(oMove.val);
map.put(oMove, cMove.next);
}
Node slibing = oMove.slibing;
if (slibing == null)
{
continue;
}
if (map.containsKey(slibing))
{
cMove.next.slibing = map.get(slibing);
}
else
{
cMove.next.slibing = new Node(slibing.val);
map.put(slibing, cMove.next.slibing);
}
}
return cHead;
}
해법 3: "신장 분열 법"
해법 분석: 1. 원 링크 를 옮 겨 다 닌 다.원 링크 의 모든 노드 뒤에 해당 하 는 복사 노드 를 삽입 하여 원 링크 를 1 배 늘 립 니 다.2. 원 링크 를 옮 겨 다 닌 다.결점 을 복사 한 slibing 연결 하기;3. 원 링크 를 옮 겨 다 닌 다.원점 과 복제 결점 을 '분열' 하여 next 를 연결 합 니 다.4. 시간 이 필요 한 복잡 도 는 O (n) 이 고 공간 복잡 도 는 O (1) 이다.
참조 코드 는 다음 과 같 습 니 다.
/** * @param oHead * @return */
public static Node copy3(Node oHead)
{
if (oHead == null)
{
return null;
}
// 1." "
for (Node oMove = oHead; oMove != null; oMove = oMove.next)
{
//
Node copy = new Node(oMove.val);
//
copy.next = oMove.next;
oMove.next = copy;
//
oMove = copy;
}
// 2. slibing
for (Node oMove = oHead; oMove != null; oMove = oMove.next)
{
if (oMove.slibing == null)
{
continue;
}
Node copy = oMove.next;
copy.slibing = oMove.slibing.next;
oMove = copy;
}
// 3." ", next next
Node cHead = oHead.next;
oHead.next = cHead.next;
cHead.next = null;
for (Node oMove = oHead.next, cMove = cHead; oMove != null; oMove = oMove.next, cMove = cMove.next)
{
Node copy = oMove.next;
oMove.next = copy.next;
copy.next = null;
cMove.next = copy;
}
return cHead;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【Codility Lesson3】FrogJmpA small frog wants to get to the other side of the road. The frog is currently located at position X and wants to get to...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.