1. 程式人生 > 實用技巧 >Max Subset Sum No adjacent

Max Subset Sum No adjacent

refer to: https://www.algoexpert.io/questions/Max%20Subset%20Sum%20No%20Adjacent

1. 題目描述

給定一個只包含正整數的陣列,返回子集的最大和,子集包含的元素之間必須是非臨界的。

2. 分析

使用動態規劃,建立一個maxSum的陣列,maxSum[i]代表當前索引下的Max Subset Sum No adjacent 的值, maxSum[0] = array[0]; maxSum[1] = Max(array[0], array[1]); maxSum[i] =Max(maxSum[i-2] + array[i], array[i-1]) when i > = 2;

if array.length == 0, return 0;

if array.length == 1, return array[0];

if array.length == 2, return Max(array[0], array[1])

else, return maxSum[i] = Max(maxSum[i-2] + array[i], array[i-1]), i > = 2;

3. 程式碼

O(N) time | O(N) space

import java.util.*;

class Program {
  public static int maxSubsetSumNoAdjacent(int
[] array) { if(array.length == 0){ return 0; }else if(array.length == 1){ return array[0]; } int[] maxSum = array.clone(); maxSum[1] = Math.max(maxSum[0], maxSum[1]); for(int i = 2; i < array.length; i++ ){ maxSum[i]
= Math.max(maxSum[i-1], maxSum[i-2] + array[i]); } return maxSum[array.length -1]; } }

省空間,O(N) time | O(1) space

由於我們每次更新當前索引下的maxSum的時候只考慮了previous two elements of current element, 我們可以只儲存這兩個元素,並對它們進行實時更新。

import java.util.*;

class Program {
  public static int maxSubsetSumNoAdjacent(int[] array) {
    
        if(array.length == 0){
            return 0;
        }else if(array.length == 1){
            return array[0];
        }
        
        int first = array[0]; 
        int second = Math.max(array[0], array[1]);
        for(int i = 2; i < array.length; i++ ){
            int curr = Math.max(second, first + array[i]);
            first = second;
            second = curr;
        }        
    return second;
  }
}