leetcode 23. K 개 정렬 링크 hard 통합
제목 설명:
합치다 k 정렬 링크알고리즘 의 복잡 도 를 분석 하고 설명 하 십시오.
문제 풀이 방향:
두 가지 방법의 복잡 도 는 모두 O (nklogk) 이다.
방법 1: 분할 통치하 다
끊 임 없 는 반 구분, 예 를 들 어 k 개의 링크 는 먼저 두 개의 k / 2 개의 링크 를 합병 하 는 임무 로 나 눈 다음 에 끊임없이 아래로 나 누 어 하나 또는 두 개의 링크 만 있 는 임무 로 나 눌 때 까지 합병 을 시작 합 니 다.예 를 들 어 6 개의 링크 를 합병 하면 분 치 법 에 따라 우 리 는 먼저 0 과 3, 1 과 4, 2 와 5 를 합병 한다.이렇게 하면 다음 에는 3 개의 링크 만 합병 하면 우 리 는 1 과 3 을 합병 하고 마지막 에 2 와 합병 하면 된다.코드 중의 k 는 (n + 1) / 2 를 통 해 계 산 된 것 입 니 다. 여기 서 왜 1 을 추가 해 야 합 니까? 이것 은 n 이 홀수 일 때 k 는 항상 후반 부 부터 시작 할 수 있 습 니 다. 예 를 들 어 n = 5 일 때 k = 3 은 0 과 3 이 합 쳐 지고 1 과 4 가 합 쳐 지 며 가장 중간 에 있 는 2 가 비어 있 습 니 다.n 이 짝수 일 때 1 을 더 해도 영향 이 없다. 예 를 들 어 n = 4 일 때 k = 2, 그러면 0 과 2 가 합병 되 고 1 과 3 이 합병 되 어 문 제 를 완벽 하 게 해결한다.
방법 2: 최소 더미
최소 더미 라 는 데이터 구 조 를 사 용 했 습 니 다. 우 리 는 먼저 k 개의 링크 의 첫 번 째 요 소 를 최소 더미 에 넣 으 면 자동 으로 순 서 를 정할 것 입 니 다.그 다음 에 우 리 는 가장 작은 요 소 를 꺼 내 서 우리 의 최종 결과 의 링크 에 넣 은 다음 에 요 소 를 꺼 내 서 다음 에 더미 에 넣 고 다음 에 가장 작은 요 소 를 꺼 내 똑 같은 조작 을 한다. 이런 식 으로 유추 하면 더미 에 요소 가 없 을 때 까지 k 개의 링크 도 하나의 링크 로 합 쳐 첫 번 째 노드 로 돌아 가면 된다.
tips:priority_queue,decltype(cmp)> pq(cmp); //쓰기 에 주의 하 다
방법 1 코드:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* mergeKLists(vector& lists) {
int n=lists.size();
if(n==0)
return nullptr;
while(n>1){
int k=(n+1)/2; // merge
for(int i=0;ivalval){
cur->next=head1;
head1=head1->next;
}
else{
cur->next=head2;
head2=head2->next;
}
cur=cur->next;
}
if(head1)
cur->next=head1;
if(head2)
cur->next=head2;
return dummy.next;
}
};
방법 2 코드:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* mergeKLists(vector& lists) {
if(lists.empty())
return nullptr;
auto cmp=[]( ListNode *&a, ListNode *&b){
return a->val>b->val; // , false
};
priority_queue,decltype(cmp)> pq(cmp); //
for(auto i:lists){
if(i!=nullptr)
pq.push(i);
}
ListNode dummy(0);
ListNode *pre=&dummy;
ListNode *cur=nullptr;
while(pq.size()){
cur=pq.top();
pq.pop();
pre->next=cur;
if(cur->next) pq.push(cur->next);
pre=pre->next;
}
return dummy.next;
}
};
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
0부터 시작하는 LeetCode Day8 「1302. Deepest Leaves Sum」해외에서는 엔지니어의 면접에 있어서 코딩 테스트라고 하는 것이 행해지는 것 같고, 많은 경우, 특정의 함수나 클래스를 주제에 따라 실장한다고 하는 것이 메인이다. 빠른 이야기가 본고장에서도 행해지고 있는 것 같은 코...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.