2021 后端笔试准备 09 (动态规划:不相连的元素的最大和)

题目描述:

输入一个int类型的数组,计算不相连的元素的最大和,

例如:在图片中的这个例子中,7和10是相连的所以他们不能相加,7 和 12 是不相连的所以他们可以相加,结果为19。

图中最大的不相连的和是 7 + 12 + 14 = 33


解题思路:

运用图中的公式 1, 迭代的去求三个数中最大的数是多少,直到数组尾部。

在图中我给出了一个例子:

实现这个算法需要两个 list 原数组遍历过程中的所有不相邻元素的最大值,用蓝色数组表示,另一个是原数组用黑色表示

代码:

这个是听完讲解之后写出来的代码,比较直观,思路也和上面一模一样。时间复杂度是O(n) 因为需要遍历整个list,空间复杂度是O(n),因为创建了一个新的数组来存储所有最大值。大家可以先想一想有没有更优化的写法,再看下面更优化的解析


下面是优化的写法,从公式出发,我们可以看实际上我们每次更新只需要两个值,如图所示,所以我们只需要用两个变量来记录这两个值,然后不断的去更新他们就好了。

 这里是将最大值用变量first 代替, 加和的结果用second记录,然后再把加和的结果赋值给first,这样first的位置肯定在second的后面,因为first是0+2所以它在2的位置,然后再把first赋值给1,这样原本first 是在0或者1的位置,这样second和下一个需要加和的数必然是不相连的。

这样就不需要用一个list来记录最大值了,只用了两个variable,所以这个写法的时间复杂度只有O(1)



Reference:代码来自Algoexpert,以学习作为主要目的来分享的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容