leetcode23 合併K個排序鍊錶(頻繁考)

2021-09-27 02:06:57 字數 1859 閱讀 8791

合併 k 個排序鍊錶,返回合併後的排序鍊錶。請分析和描述演算法的複雜度。

示例:輸入:

[1->4->5,

1->3->4,

2->6

]輸出: 1->1->2->3->4->4->5->6

經典k路歸併,這裡採用二分遞迴

歸併兩個有序陣列時間複雜度為o(n),將k個有序陣列分治歸併時間複雜度為o(logk),演算法整體時間複雜度為o(nlogk)

/**

* definition for singly-linked list.

* struct listnode

* };

*/class solution

listnode* mergek(vector& lists,int l,int r)

listnode* merge(listnode* l,listnode* r)else

cur = cur->next;

}if(l) cur->next = l;

else if(r) cur->next = r;

return dummy_head->next;

}};

k大小的堆,時間複雜度也是nlogk

/**

* definition for singly-linked list.

* struct listnode

* };

*/struct cmp};

class solution

while(!q.empty())

return dummy_head->next;

}};

你有 k 個公升序排列的整數陣列。找到乙個最小區間,使得 k 個列表中的每個列表至少有乙個數包含在其中。

我們定義如果 b-a < d-c 或者在 b-a == d-c 時 a < c,則區間 [a,b] 比 [c,d] 小。

示例 1:

輸入:[[4,10,15,24,26], [0,9,12,20], [5,18,22,30]]

輸出: [20,24]

解釋: 

列表 1:[4, 10, 15, 24, 26],24 在區間 [20,24] 中。

列表 2:[0, 9, 12, 20],20 在區間 [20,24] 中。

列表 3:[5, 18, 22, 30],22 在區間 [20,24] 中。

注意:給定的列表可能包含重複元素,所以在這裡公升序表示 >= 。

1 <= k <= 3500

-105 <= 元素的值 <= 105

使用k路歸併,堆來做,事實上每一次歸併前的k個就是乙個區間

這題實現起來比較難,因為是陣列,不是鍊錶,所以用堆的時候,堆內放置

(數值(用來排序),來自哪個數值)的二元組

同時利用index陣列,記錄每個陣列下一次需要訪問的下標

// 小頂堆

struct cmp

};class solution );

cur_max = max(cur_max,nums[i][0]);

}vectorres;

// 沒有乙個陣列走到尾

while(index[q.top().second] < nums[q.top().second].size()));

// 更新下一次需要訪問的下標

index[cur]++;

// 獲得此次堆中的最大最小區間

if((cur_max-q.top().first) < res[1]-res[0])

}return res;

}};

分治實現LeetCode 23題 合併K個排序鍊錶

紀念第一道沒有看題解做出來的困難題 分治思想 歸併排序實現合併k個排序鍊錶 由於是實現一連串已經排序的鍊錶,所以第一時間想到了歸併排序 又由於是實現多個鍊錶的總排序,為了減少時間複雜度又想到了分治思想,這一題中也就是二分法 做了這麼多天的題總算有點進步 class solution 結果陣列的頭結點...

LeetCode 23 合併 K個排序序列

合併 k 個排序鍊錶,返回合併後的排序鍊錶。請分析和描述演算法的複雜度。示例 輸入 1 4 5,1 3 4,2 6 輸出 1 1 2 3 4 4 5 6 解題思路 採用分治的思想,將 k 個鍊錶的合併問題轉換成,合併 2 個有序鍊錶的問題 typedef struct listnode list 定...

Leetcode23 合併K個排序鍊錶

題目 解題思路 這道題使用的是分治演算法。首先還用輔助函式mergetwolists 用來合併兩個有序單鏈表,不申請額外的空間實現原地合併。如下 listnode mergetwolists listnode l1,listnode l2 else head nexthead while l1 nu...