求数组不相邻元素的最大和

3,057 阅读1分钟

小明要在街上一排互相相邻的糖果屋拿糖,但不能在两个相邻的糖果屋同时拿糖。给定一个数组列表,每个元素代表每间房子中的糖的数目,小明一次最多能拿多少糖。

基本样例输入输出:

输入: [1,5,3,1,7]
输出: 12

来看一下,这个题目其实就是在考察不相邻元素的最大和

思路:

前i个元素的最大子数组包含第i个元素和不包含第i个元素。

  1. 包含第i个元素,则一定不能包含第i-1个元素,包含第i个元素的最大子数组为不包含第i-1个元素的最大子数组和加上第i个元素
  2. 不包含第i个元素,则前i个元素的最大子数组和就是前i-1个元素的最大子数组和,因为

对于前i个元素,设包含第i个元素的最大子数组和为dp[i],不包含第i个元素的最大子数组和为np[i],前i个元素的最大子数组和为max(dp[i], np[i]),根据上面的分析,则有如下推导公式:

  • dp[i] = np[i-1]+arr[i]
  • np[i] = max(np[i-1], dp[i-1])
  const maxSum = arr => {
  const size = arr.length;
  if (size <= 0) return 0;
  else if (size == 1) return arr[0];

  let excludeLast = 0,
    includeLast = arr[0];
  let excludeTemp;
  for (let i = 1; i < size; i++) {
    excludeTemp = excludeLast > includeLast ? excludeLast : includeLast;
    includeLast = excludeLast + arr[i];
    excludeLast = excludeTemp;
  }
  return includeLast > excludeLast ? includeLast : excludeLast;
};