题目描述:
输入一个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,以学习作为主要目的来分享的。