面试算法|23. Merge k Sorted Lists的三种解法

23. Merge k Sorted Lists

一道非常经典的题目。第二次做,学着用三种方法来解答,并且不断优化

解法1 暴力

每次都对 K K K个list进行循环,找到最小的那个Node加入我们最后的结果list。
time complexity: O ( k N ) O(kN) O(kN)
N N N个数字,每个数字都要经过k次比较才会放进结果list中,不可取。

解法2 priority queue

每次都要找最小的,不妨用PQ来解决。我们将k的数压入PQ,注意 这里使用了lambda expression来定义PQ

PriorityQueue pQueue = new PriorityQueue((o1,o2)->{
        	return o1.val - o2.val;
        }) ;

初始化: O ( k l o g k ) O(klogk) O(klogk)
弹出: O ( N l o g k ) O(Nlogk) O(Nlogk)
一共弹出 N N N个元素,每个元素弹出的时间复杂度都是 l o g k logk logk
看起来又优化了一些

解法3 Divide and conquer

我们这道题是基于Merge 2 sorted lists 来的。
因此可以看作是分治法,不断分,直到最小的部分是两个list合并。
T ( n ) = 2 T ( n / 2 ) + N T(n) = 2T(n/2) +N T(n)=2T(n/2)+N
T ( n ) = N l o g k T(n) = Nlogk T(n)=Nlogk
一共有 K K K个list,因此求复杂度的递归树一共有logk层
面试算法|23. Merge k Sorted Lists的三种解法_第1张图片
我们可以看到从上向下三种方法的时间不断增加,可以看作是优化

你可能感兴趣的:(CS577,分治法)