热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

最大化两个非空子集之间的和的差异:集合划分策略分析

将一个集合划分为两个非空子集,使得子集和的差最大原文:https://www . geeksforgeeks . org/par

将一个集合划分为两个非空子集,使得子集和的差最大

原文:https://www . geeksforgeeks . org/partition-a-set-in-two-non-empty-subset-sums-different-of-subset-sums-max/

给定一组整数 S ,任务是将给定的集合分成两个非空集合 S1S2 ,使得它们的和之间的绝对差最大,即 abs(和(S1)–和(S2)) 最大。

示例:

输入: S[] = { 1,2,1 }
输出: 2
说明:
子集为{1}和{2,1 }。它们的绝对差是
ABS(1 –( 2+1))= 2,最大。

输入: S[] = { -2,3,-1,5 }
输出: 11
说明:
子集为{-1,-2}和{3,5 }。它们的绝对差是
abs((-1,-2)–(3+5))= 11,最大。

天真法:生成并存储整数集合的所有子集,求子集之和与集合之和与该子集之和之差的最大绝对差,即ABS(sum(S1)–(totalSum–sum(S1))
时间复杂度:O(2N)
辅助空间: O(2 N )

高效方法:优化幼稚方法,思路是用一些数学观察。这个问题可以分为两种情况:


  • 如果集合只包含正整数或负整数,那么最大差值是通过拆分集合得到的,使得一个子集只包含集合的最小元素,而另一个子集包含集合的所有剩余元素,即,


ABS((total sum–min(S))–min(S))ABS(total sum–2×min(S))其中 S** 为整数集



  • 如果集合同时包含正整数和负整数,则最大差值通过拆分集合来获得,使得一个子集包含所有正整数,而另一个子集包含所有负整数,即,


ABS(sum(S1)–sum(S2)ABS(sum(S)其中 S1、S2 分别为正整数和负整数的集合。

下面是上述方法的实现:

C++

// C++ Program for above approach
#include
using namespace std;
// Function to return the maximum
// difference between the subset sums
int maxDiffSubsets(int arr[], int N)
{
    // Stores the total
    // sum of the array
    int totalSum = 0;
    // Checks for positive
    // and negative elements
    bool pos = false, neg = false;
    // Stores the minimum element
    // from the given array
    int min = INT_MAX;
    // Traverse the array
    for (int i = 0; i     {
        // Calculate total sum
        totalSum += abs(arr[i]);
        // Mark positive element
        // present in the set
        if (arr[i] > 0)
            pos = true;
        // Mark negative element
        // present in the set
        if (arr[i] <0)
            neg = true;
        // Find the minimum
        // element of the set
        if (arr[i]             min = arr[i];
    }
    // If the array contains both
    // positive and negative elements
    if (pos && neg)
        return totalSum;
    // Otherwise
    else
        return totalSum - 2 * min;
}
// Driver Code
int main()
{
    // Given the array
    int S[] = {1, 2, 1};
    // Length of the array
    int N = sizeof(S) / sizeof(S[0]);
    if (N <2)
        cout <<("Not Possible");
    else
        // Function Call
        cout <<(maxDiffSubsets(S, N));
}
// This code is contributed by Chitranayal

Java 语言(一种计算机语言,尤用于创建网站)

// Java Program for above approach
import java.util.*;
import java.lang.*;
class GFG {
    // Function to return the maximum
    // difference between the subset sums
    static int maxDiffSubsets(int[] arr)
    {
        // Stores the total
        // sum of the array
        int totalSum = 0;
        // Checks for positive
        // and negative elements
        boolean pos = false, neg = false;
        // Stores the minimum element
        // from the given array
        int min = Integer.MAX_VALUE;
        // Traverse the array
        for (int i = 0; i             // Calculate total sum
            totalSum += Math.abs(arr[i]);
            // Mark positive element
            // present in the set
            if (arr[i] > 0)
                pos = true;
            // Mark negative element
            // present in the set
            if (arr[i] <0)
                neg = true;
            // Find the minimum
            // element of the set
            if (arr[i]                 min = arr[i];
        }
        // If the array contains both
        // positive and negative elements
        if (pos && neg)
            return totalSum;
        // Otherwise
        else
            return totalSum - 2 * min;
    }
    // Driver Code
    public static void main(String[] args)
    {
        // Given the array
        int[] S = { 1, 2, 1 };
        // Length of the array
        int N = S.length;
        if (N <2)
            System.out.println("Not Possible");
        else
            // Function Call
            System.out.println(maxDiffSubsets(S));
    }
}

Python 3

# Python3 program for above approach
import sys
# Function to return the maximum
# difference between the subset sums
def maxDiffSubsets(arr):
    # Stores the total
    # sum of the array
    totalSum = 0
    # Checks for positive
    # and negative elements
    pos = False
    neg = False
    # Stores the minimum element
    # from the given array
    min = sys.maxsize
    # Traverse the array
    for i in range(len(arr)):
        # Calculate total sum
        totalSum += abs(arr[i])
        # Mark positive element
        # present in the set
        if (arr[i] > 0):
            pos = True
        # Mark negative element
        # present in the set
        if (arr[i] <0):
            neg = True
        # Find the minimum
        # element of the set
        if (arr[i]             min = arr[i]
    # If the array contains both
    # positive and negative elements
    if (pos and neg):
        return totalSum
    # Otherwise
    else:
        return totalSum - 2 * min
# Driver Code
if __name__ == '__main__':
    # Given the array
    S = [ 1, 2, 1 ]
    # Length of the array
    N = len(S)
    if (N <2):
        print("Not Possible")
    else:
        # Function Call
        print(maxDiffSubsets(S))
# This code is contributed by mohit kumar 29

C

// C# Program for above approach
using System;
class GFG{
    // Function to return the maximum
    // difference between the subset sums
    static int maxDiffSubsets(int[] arr)
    {
        // Stores the total
        // sum of the array
        int totalSum = 0;
        // Checks for positive
        // and negative elements
        bool pos = false, neg = false;
        // Stores the minimum element
        // from the given array
        int min = int.MaxValue;
        // Traverse the array
        for (int i = 0; i         {
            // Calculate total sum
            totalSum += Math.Abs(arr[i]);
            // Mark positive element
            // present in the set
            if (arr[i] > 0)
                pos = true;
            // Mark negative element
            // present in the set
            if (arr[i] <0)
                neg = true;
            // Find the minimum
            // element of the set
            if (arr[i]                 min = arr[i];
        }
        // If the array contains both
        // positive and negative elements
        if (pos && neg)
            return totalSum;
        // Otherwise
        else
            return totalSum - 2 * min;
    }
    // Driver Code
    public static void Main(String[] args)
    {
        // Given the array
        int[] S = {1, 2, 1};
        // Length of the array
        int N = S.Length;
        if (N <2)
            Console.WriteLine("Not Possible");
        else
            // Function Call
            Console.WriteLine(maxDiffSubsets(S));
    }
}
// This code is contributed by Rajput-Ji

java 描述语言


Output: 

2

时间复杂度:O(N)
T5
辅助空间:** O(1)


推荐阅读
  • 一个产品数组拼图|集合 2 (O(1)空间) ... [详细]
  • 线程是创建并发的底层工具,因此具有一定的局限性。没有简单的方法可以从联合(Join)线程得到“返回值”。因此必须创建一些共享域。当抛出一个异常时,捕捉和处理异常也是麻烦的。线程完成之后,无法再次启动该 ... [详细]
  • 本文探讨了在Java应用中实现线程池优雅关闭的两种方法,包括使用ShutdownHook注册钩子函数以及通过SignalHandler处理信号量。每种方法都提供了具体的代码示例,并讨论了可能遇到的问题及解决方案。 ... [详细]
  • 在现代多线程编程中,Lock接口提供的灵活性和控制力超越了传统的synchronized关键字。Lock接口不仅使锁成为一个独立的对象,还提供了更细粒度的锁定机制,例如读写锁(ReadWriteLock)。本文将探讨如何利用ReentrantReadWriteLock提高并发性能。 ... [详细]
  • 必知必会13条importosos.environ.setdefault(DJANGO_SETTINGS_MODULE,orm_practice.settings)impo ... [详细]
  • 本文深入探讨了Java注解的基本概念及其在现代Java开发中的应用。文章不仅介绍了如何创建和使用自定义注解,还详细讲解了如何利用反射机制解析注解,以及Java内建注解的使用场景。 ... [详细]
  • 本文详细介绍了 C# 编程语言中 Main 方法的作用、不同形式及其使用场景,帮助开发者更好地理解和应用这一重要概念。 ... [详细]
  • 快速排序是基于分治策略的一种排序算法,其平均时间复杂度为O(n log n),在大多数情况下表现优于其他排序算法。本文将详细介绍快速排序的工作原理,并提供一个Java语言的具体实现。 ... [详细]
  • 本文介绍了如何通过十折交叉验证方法评估回归模型的性能。我们将使用PyTorch框架,详细展示数据处理、模型定义、训练及评估的完整流程。 ... [详细]
  • 本文章介绍了如何将阿拉伯数字形式的金额转换为中国传统的大写形式,适用于财务报告和正式文件中的金额表示。 ... [详细]
  • 本文介绍了如何在 Linux 系统上构建网络路由器,特别关注于使用 Zebra 软件实现动态路由功能。通过具体的案例,展示了如何配置 RIP 和 OSPF 协议,以及如何利用多路由器查看工具(MRLG)监控网络状态。 ... [详细]
  • 首先说一下,这是我在CSDN上的第一个文章,其实这个账号早在几年前就申请了,不过当时只是为了下载一个资源,而且也不怎么懂信息技术相关的领域,后来就再也没怎么动过,直到今天我才开始使用这个账号 ... [详细]
  • 本文深入探讨了企业级开发框架NHibernate和Spring.NET的关键特性之一——面向方面编程(AOP)。文章不仅介绍了AOP的基本概念及其如何增强面向对象编程(OOP),还详细说明了Spring.NET中AOP的具体应用,包括事务管理和自定义方面的实现。 ... [详细]
  • 转载网址:http:www.open-open.comlibviewopen1326597582452.html参考资料:http:www.cocos2d-ip ... [详细]
  • Flutter 高德地图插件使用指南
    本文档详细介绍了如何在Flutter项目中集成和使用高德地图插件,包括安装、配置及基本使用方法。 ... [详细]
author-avatar
城市学院艺术英语
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有