• 博客园logo
  • 会员
  • 周边
  • 众包
  • 新闻
  • 博问
  • 闪存
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
LilyLiya
博客园    首页    新随笔    联系   管理    订阅  订阅
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;
  }
}

 

posted on 2021-01-11 14:22  LilyLiya  阅读(139)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3