算法:堆+多路归并
146. 序列
问题:有m个序列,每个序列有n个数,从每个序列中选出一个数,共选出m个数。一共可以选出n的m次方个“这m个数”。询问所有选出的m个数的和中前n个最小的和为多少。
1.先考虑从俩个序列中选择的情况。当前的问题是从俩个序列中选出n对数,并且最小。可以先对一个序列进行降序排序,那么最小值一定在a1+b1 a1+b2 a1+b3 ....a1+bn之中,找出最小的后,还需要找n-1个。假设第一个最小的在第二个,那么第二个最小的一定在a1+b1 a2+b2 a1+b3....a1+bn之中,可以利用多路归并解决(堆、优先队列)。最后将结果全部记录。
2.考虑多个序列间的关系,猜想前俩个序列合并所得的前n个最小值和当前序列合并得到的前n个最小值一定是最小的。由于三个序列的前n个和的最小值是一定的,假设前n个最小值的最小值为a1+b2+c5,尚诺c5不是c数组中最小的,与假设矛盾。假设a1+b2不是最小值,与假设矛盾。并且发现无论前多少个序列合并,所得到的新数组一定是ai+bj+ck+....的组合,并且对于每一个数字都是最优解。