给定数组arr [] ,任务是找到包含相等数量的正负元素的最大和子集。
例子:
Input: arr[] = {1, -2, 3, 4, -5, 8}
Output: 6
Explanation:
Maximum sum subset with equal number of positive and negative elements {8, -2}
Input: arr[] = {-1, -2, -3, -4, -5}
Output: 0
Explanation:
As there are no positive element in the array, Maximum sum subset will be {}
方法:想法是将负元素和正元素存储到两个不同的数组中,然后按升序对它们分别进行排序。然后使用两个指针,每个指针从每个数组的最高元素开始,包括总和大于0的那些对。否则,如果该对的总和小于0,则停止查找更多元素,因为使用a不可能存在这样的对左对中的总和大于0。
下面是上述方法的实现:
C++
// C++ implementation to find the
// maximum sum subset having equal
// number of positive and negative
// elements in the subset
#include
using namespace std;
// Function to find maximum sum
// subset with equal number of
// positive and negative elements
int findMaxSum(int* arr, int n)
{
vector a;
vector b;
// Loop to store the positive
// and negative elements in
// two different array
for (int i = 0; i < n; i++) {
if (arr[i] > 0) {
a.push_back(arr[i]);
}
else if (arr[i] < 0) {
b.push_back(arr[i]);
}
}
// Sort both the array
sort(a.begin(), a.end());
sort(b.begin(), b.end());
// Pointers starting from
// the highest elements
int p = a.size() - 1;
int q = b.size() - 1;
int s = 0;
// Find pairs having sum
// greater than zero
while (p >= 0 && q >= 0) {
if (a[p] + b[q] > 0) {
s = s + a[p] + b[q];
}
else {
break;
}
p = p - 1;
q = q - 1;
}
return s;
}
// Driver code
int main()
{
int arr1[] = { 1, -2, 3, 4, -5, 8 };
int n1 = sizeof(arr1) / sizeof(arr1[0]);
cout << findMaxSum(arr1, n1) << endl;
return 0;
}
Java
// Java implementation to find the
// maximum sum subset having equal
// number of positive and negative
// elements in the subset
import java.util.*;
class GFG{
// Function to find maximum sum
// subset with equal number of
// positive and negative elements
static int findMaxSum(int []arr, int n)
{
Vector a = new Vector();
Vector b = new Vector();
// Loop to store the positive
// and negative elements in
// two different array
for(int i = 0; i < n; i++)
{
if (arr[i] > 0)
{
a.add(arr[i]);
}
else if (arr[i] < 0)
{
b.add(arr[i]);
}
}
// Sort both the array
Collections.sort(a);
Collections.sort(b);
// Pointers starting from
// the highest elements
int p = a.size() - 1;
int q = b.size() - 1;
int s = 0;
// Find pairs having sum
// greater than zero
while (p >= 0 && q >= 0)
{
if (a.get(p) + b.get(q) > 0)
{
s = s + a.get(p) + b.get(q);
}
else
{
break;
}
p = p - 1;
q = q - 1;
}
return s;
}
// Driver code
public static void main(String[] args)
{
int arr1[] = { 1, -2, 3, 4, -5, 8 };
int n1 = arr1.length;
System.out.print(
findMaxSum(arr1, n1) + "\n");
}
}
// This code is contributed by 29AjayKumar
Python3
# Python3 implementation to find the
# maximum sum subset having equal
# number of positive and negative
# elements in the subset
# Function to find maximum sum
# subset with equal number of
# positive and negative elements
def findMaxSum(arr, n):
a = []
b = []
# Loop to store the positive
# and negative elements in
# two different array
for i in range(n):
if (arr[i] > 0):
a.append(arr[i])
elif (arr[i] < 0):
b.append(arr[i])
# Sort both the array
a.sort()
b.sort()
# Pointers starting from
# the highest elements
p = len(a) - 1
q = len(b) - 1
s = 0
# Find pairs having sum
# greater than zero
while (p >= 0 and q >= 0):
if (a[p] + b[q] > 0):
s = s + a[p] + b[q]
else:
break
p = p - 1
q = q - 1
return s
# Driver code
arr1 = [ 1, -2, 3, 4, -5, 8 ]
n1 = len(arr1)
print(findMaxSum(arr1, n1))
# This code is contributed by shubhamsingh10
C#
// C# implementation to find the
// maximum sum subset having equal
// number of positive and negative
// elements in the subset
using System;
using System.Collections.Generic;
class GFG{
// Function to find maximum sum
// subset with equal number of
// positive and negative elements
static int findMaxSum(int []arr, int n)
{
List a = new List();
List b = new List();
// Loop to store the positive
// and negative elements in
// two different array
for(int i = 0; i < n; i++)
{
if (arr[i] > 0)
{
a.Add(arr[i]);
}
else if (arr[i] < 0)
{
b.Add(arr[i]);
}
}
// Sort both the array
a.Sort();
b.Sort();
// Pointers starting from
// the highest elements
int p = a.Count - 1;
int q = b.Count - 1;
int s = 0;
// Find pairs having sum
// greater than zero
while (p >= 0 && q >= 0)
{
if (a[p] + b[q] > 0)
{
s = s + a[p] + b[q];
}
else
{
break;
}
p = p - 1;
q = q - 1;
}
return s;
}
// Driver code
public static void Main(String[] args)
{
int []arr1 = { 1, -2, 3, 4, -5, 8 };
int n1 = arr1.Length;
Console.Write(findMaxSum(arr1, n1) + "\n");
}
}
// This code is contributed by Amit Katiyar
输出:
6
性能分析:
- 时间复杂度: O(N * logN)
- 辅助空间: O(N)