数组的最小乘积子集

给定一个数组a,我们必须找到数组中元素子集的最小乘积。最小乘积也可以是单个元素。

null

例如:

Input : a[] = { -1, -1, -2, 4, 3 }Output : -24Explanation : Minimum product will be ( -2 * -1 * -1 * 4 * 3 ) = -24Input : a[] = { -1, 0 }Output : -1Explanation : -1(single element) is minimum product possible Input : a[] = { 0, 0, 0 }Output : 0

一个简单的解决办法是 生成所有子集 ,找到每个子集的乘积并返回最小乘积。 更好的解决方法是使用以下事实。

  1. 如果有偶数个负数且没有零,则结果是除最大值负数外的所有负数的乘积。
  2. 如果有一个奇数的负数而没有零,结果就是所有的乘积。
  3. 如果有零和正,没有负,结果是0。例外情况是,当没有负数,所有其他元素都是正数时,我们的结果应该是第一个最小正数。

C++

// CPP program to find maximum product of
// a subset.
#include <bits/stdc++.h>
using namespace std;
int minProductSubset( int a[], int n)
{
if (n == 1)
return a[0];
// Find count of negative numbers, count
// of zeros, maximum valued negative number,
// minimum valued positive number and product
// of non-zero numbers
int max_neg = INT_MIN;
int min_pos = INT_MAX;
int count_neg = 0, count_zero = 0;
int prod = 1;
for ( int i = 0; i < n; i++) {
// If number is 0, we don't
// multiply it with product.
if (a[i] == 0) {
count_zero++;
continue ;
}
// Count negatives and keep
// track of maximum valued negative.
if (a[i] < 0) {
count_neg++;
max_neg = max(max_neg, a[i]);
}
// Track minimum positive
// number of array
if (a[i] > 0)
min_pos = min(min_pos, a[i]);
prod = prod * a[i];
}
// If there are all zeros
// or no negative number present
if (count_zero == n
|| (count_neg == 0 && count_zero > 0))
return 0;
// If there are all positive
if (count_neg == 0)
return min_pos;
// If there are even number of
// negative numbers and count_neg not 0
if (!(count_neg & 1) && count_neg != 0) {
// Otherwise result is product of
// all non-zeros divided by maximum
// valued negative.
prod = prod / max_neg;
}
return prod;
}
int main()
{
int a[] = { -1, -1, -2, 4, 3 };
int n = sizeof (a) / sizeof (a[0]);
cout << minProductSubset(a, n);
return 0;
}


JAVA

// Java program to find maximum product of
// a subset.
class GFG {
static int minProductSubset( int a[], int n)
{
if (n == 1 )
return a[ 0 ];
// Find count of negative numbers,
// count of zeros, maximum valued
// negative number, minimum valued
// positive number and product of
// non-zero numbers
int negmax = Integer.MIN_VALUE;
int posmin = Integer.MAX_VALUE;
int count_neg = 0 , count_zero = 0 ;
int product = 1 ;
for ( int i = 0 ; i < n; i++) {
// if number is zero,count it
// but dont multiply
if (a[i] == 0 ) {
count_zero++;
continue ;
}
// count the negative numbers
// and find the max negative number
if (a[i] < 0 ) {
count_neg++;
negmax = Math.max(negmax, a[i]);
}
// find the minimum positive number
if (a[i] > 0 && a[i] < posmin)
posmin = a[i];
product *= a[i];
}
// if there are all zeroes
// or zero is present but no
// negative number is present
if (count_zero == n
|| (count_neg == 0 && count_zero > 0 ))
return 0 ;
// If there are all positive
if (count_neg == 0 )
return posmin;
// If there are even number except
// zero of negative numbers
if (count_neg % 2 == 0 && count_neg != 0 ) {
// Otherwise result is product of
// all non-zeros divided by maximum
// valued negative.
product = product / negmax;
}
return product;
}
// main function
public static void main(String[] args)
{
int a[] = { - 1 , - 1 , - 2 , 4 , 3 };
int n = 5 ;
System.out.println(minProductSubset(a, n));
}
}
// This code is contributed by Arnab Kundu.


Python3

# Python3 program to find maximum
# product of a subset.
# def to find maximum
# product of a subset
def minProductSubset(a, n):
if (n = = 1 ):
return a[ 0 ]
# Find count of negative numbers,
# count of zeros, maximum valued
# negative number, minimum valued
# positive number and product
# of non-zero numbers
max_neg = float ( '-inf' )
min_pos = float ( 'inf' )
count_neg = 0
count_zero = 0
prod = 1
for i in range ( 0 , n):
# If number is 0, we don't
# multiply it with product.
if (a[i] = = 0 ):
count_zero = count_zero + 1
continue
# Count negatives and keep
# track of maximum valued
# negative.
if (a[i] < 0 ):
count_neg = count_neg + 1
max_neg = max (max_neg, a[i])
# Track minimum positive
# number of array
if (a[i] > 0 ):
min_pos = min (min_pos, a[i])
prod = prod * a[i]
# If there are all zeros
# or no negative number
# present
if (count_zero = = n or (count_neg = = 0
and count_zero > 0 )):
return 0
# If there are all positive
if (count_neg = = 0 ):
return min_pos
# If there are even number of
# negative numbers and count_neg
# not 0
if ((count_neg & 1 ) = = 0 and
count_neg ! = 0 ):
# Otherwise result is product of
# all non-zeros divided by
# maximum valued negative.
prod = int (prod / max_neg)
return prod
# Driver code
a = [ - 1 , - 1 , - 2 , 4 , 3 ]
n = len (a)
print (minProductSubset(a, n))
# This code is contributed by
# Manish Shaw (manishshaw1)


C#

// C# program to find maximum product of
// a subset.
using System;
public class GFG {
static int minProductSubset( int [] a, int n)
{
if (n == 1)
return a[0];
// Find count of negative numbers,
// count of zeros, maximum valued
// negative number, minimum valued
// positive number and product of
// non-zero numbers
int negmax = int .MinValue;
int posmin = int .MinValue;
int count_neg = 0, count_zero = 0;
int product = 1;
for ( int i = 0; i < n; i++) {
// if number is zero, count it
// but dont multiply
if (a[i] == 0) {
count_zero++;
continue ;
}
// count the negative numbers
// and find the max negative number
if (a[i] < 0) {
count_neg++;
negmax = Math.Max(negmax, a[i]);
}
// find the minimum positive number
if (a[i] > 0 && a[i] < posmin) {
posmin = a[i];
}
product *= a[i];
}
// if there are all zeroes
// or zero is present but no
// negative number is present
if (count_zero == n
|| (count_neg == 0 && count_zero > 0))
return 0;
// If there are all positive
if (count_neg == 0)
return posmin;
// If there are even number except
// zero of negative numbers
if (count_neg % 2 == 0 && count_neg != 0) {
// Otherwise result is product of
// all non-zeros divided by maximum
// valued negative.
product = product / negmax;
}
return product;
}
// main function
public static void Main()
{
int [] a = new int [] { -1, -1, -2, 4, 3 };
int n = 5;
Console.WriteLine(minProductSubset(a, n));
}
}
// This code is contributed by Ajit.


PHP

<?php
// PHP program to find maximum
// product of a subset.
// Function to find maximum
// product of a subset
function minProductSubset( $a , $n )
{
if ( $n == 1)
return $a [0];
// Find count of negative numbers,
// count of zeros, maximum valued
// negative number, minimum valued
// positive number and product
// of non-zero numbers
$max_neg = PHP_INT_MIN;
$min_pos = PHP_INT_MAX;
$count_neg = 0; $count_zero = 0;
$prod = 1;
for ( $i = 0; $i < $n ; $i ++)
{
// If number is 0, we don't
// multiply it with product.
if ( $a [ $i ] == 0)
{
$count_zero ++;
continue ;
}
// Count negatives and keep
// track of maximum valued
// negative.
if ( $a [ $i ] < 0)
{
$count_neg ++;
$max_neg = max( $max_neg , $a [ $i ]);
}
// Track minimum positive
// number of array
if ( $a [ $i ] > 0)
$min_pos = min( $min_pos , $a [ $i ]);
$prod = $prod * $a [ $i ];
}
// If there are all zeros
// or no negative number
// present
if ( $count_zero == $n ||
( $count_neg == 0 &&
$count_zero > 0))
return 0;
// If there are all positive
if ( $count_neg == 0)
return $min_pos ;
// If there are even number of
// negative numbers and count_neg
// not 0
if (!( $count_neg & 1) &&
$count_neg != 0)
{
// Otherwise result is product of
// all non-zeros divided by maximum
// valued negative.
$prod = $prod / $max_neg ;
}
return $prod ;
}
// Driver code
$a = array ( -1, -1, -2, 4, 3 );
$n = sizeof( $a );
echo (minProductSubset( $a , $n ));
// This code is contributed by Ajit.
?>


Javascript

<script>
// Javascript program to find maximum
// product of a subset.
function minProductSubset(a, n)
{
if (n == 1)
return a[0];
// Find count of negative numbers,
// count of zeros, maximum valued
// negative number, minimum valued
// positive number and product of
// non-zero numbers
let negmax = Number.MIN_VALUE;
let posmin = Number.MIN_VALUE;
let count_neg = 0, count_zero = 0;
let product = 1;
for (let i = 0; i < n; i++)
{
// If number is zero, count it
// but dont multiply
if (a[i] == 0)
{
count_zero++;
continue ;
}
// Count the negative numbers
// and find the max negative number
if (a[i] < 0)
{
count_neg++;
negmax = Math.max(negmax, a[i]);
}
// Find the minimum positive number
if (a[i] > 0 && a[i] < posmin)
{
posmin = a[i];
}
product *= a[i];
}
// If there are all zeroes
// or zero is present but no
// negative number is present
if (count_zero == n || (count_neg == 0 &&
count_zero > 0))
return 0;
// If there are all positive
if (count_neg == 0)
return posmin;
// If there are even number except
// zero of negative numbers
if (count_neg % 2 == 0 && count_neg != 0)
{
// Otherwise result is product of
// all non-zeros divided by maximum
// valued negative.
product = parseInt(product / negmax, 10);
}
return product;
}
// Driver code
let a = [ -1, -1, -2, 4, 3 ];
let n = 5;
document.write(minProductSubset(a, n));
// This code is contributed by rameshtravel07
</script>


输出:

-24

时间复杂性: O(n) 辅助空间: O(1)

© 版权声明
THE END
喜欢就支持一下吧
点赞6 分享