一、实践题目
二、题目描述
给定一串序列,每次取两个数的值加起来,然后把两个数取出来,将两个数加起来的值放入序列
三、算法描述
题目大意其实类似哈夫曼编码,只是他还要再求一个最大值的
因此进行两次操作,一次每次都是取最大的两个数,另一次每次都是取最小的两个数
每次取到的两个最大或者最小的数a、b进行合并,合并后又形成一个新的数(c = a+b)
再将c放入,和剩下的数进行比较,再挑出最小的或最大的,一直进行下去
运用优先队列,每次取出a、b时,便从队列中把a、b弹出去,再让c(c=a+b)进队
四、算法时间和空间复杂度分析
时间复杂度:队列中有N个数,因为每次都是取队列中两个数相加,直到队列为空,用一个while循环即可,只需要N次;而优先队列中的pop(),push() 需要log N
因此时间复杂度为 O(Nlog N)
空间复杂度: 需要两个队列的空间,O(N)
五、心得体会
这次的题感觉比上次动态规划的容易一些,所以还是比较快做出来了。其实还是有点像动态规划吧,找一个贪心算法,然后每一步都用那个贪心策略即可。