Minimize Product Sum of Two Arrays

Updated on 11 June, 2025
Minimize Product Sum of Two Arrays header image

Problem Statement

In this task, you are presented with two integer arrays, nums1 and nums2, of equal length n. The objective is to compute the "product sum" of these two arrays, which is the sum of products of corresponding elements from each array. More formally, for a given index i, the product term is nums1[i] * nums2[i], and the "product sum" is the sum of all these individual product terms from i = 0 to i = n-1.

To achieve the minimal product sum, you are permitted to rearrange the elements of nums1 in any order. The challenge here is not just to calculate the product sum, but to manipulate the array nums1 such that when paired with nums2, the resulting product sum is as small as possible.

Examples

Example 1

Input:

nums1 = [5,3,4,2], nums2 = [4,2,2,5]

Output:

40

Explanation:

 We can rearrange nums1 to become [3,5,4,2]. The product sum of [3,5,4,2] and [4,2,2,5] is 3*4 + 5*2 + 4*2 + 2*5 = 40.

Example 2

Input:

nums1 = [2,1,4,5,7], nums2 = [3,2,4,8,6]

Output:

65

Explanation:

We can rearrange nums1 to become [5,7,4,1,2]. The product sum of [5,7,4,1,2] and [3,2,4,8,6] is 5*3 + 7*2 + 4*4 + 1*8 + 2*6 = 65.

Constraints

  • n == nums1.length == nums2.length
  • 1 <= n <= 105
  • 1 <= nums1[i], nums2[i] <= 100

Approach and Intuition

To determine the minimum product sum:

  1. Sort Both Arrays Differently:

    • To achieve the minimum product sum, simply optimize the order of multiplication to minimize each product in the sum.
    • Sort nums1 in ascending order and nums2 in descending order. This pairing strategy is based on the mathematical idea where multiplying the largest number with the smallest provides the smallest product. This method ensures that the largest elements of nums2 are paired with the smallest elements of nums1 and vice versa, thus minimizing the overall sum.
  2. Calculate the Product Sum:

    • After sorting, compute the product sum using the formula:
    sum = nums1[i] * nums2[i] for each i from 0 to n-1

    where i is the index after rearranging nums1 and keeping nums2 in its sorted order.

  3. Examples Explanation:

    • From the examples provided, rearranging nums1 to pair the smallest available value from nums1 with the largest from nums2 achieved the minimum product sum. For instance, pairing [3,5,4,2] in nums1 with [4,2,2,5] in nums2 resulted in a minimal product sum in Example 1.

By following this strategy of counterbalancing the largest and smallest values, we ensure the product terms are minimized, effectively yielding the lowest possible "product sum" for the given pairs of arrays.

Solutions

  • C++
  • Java
  • Python
cpp
class Solution {
public:
    int computeMinProductSum(vector<int>& arr1, vector<int>& arr2) {
        vector<int> tally1(101), tally2(101);

        for (int x : arr1)
            tally1[x]++;
        for (int x : arr2)
            tally2[x]++;
        
        int pointerLow = 1, pointerHigh = 100, totalProductSum = 0;
        int count;
        
        while (pointerLow < 101 && pointerHigh > 0) {
            while (pointerLow < 101 && tally1[pointerLow] == 0) 
                pointerLow++;

            while (pointerHigh > 0 && tally2[pointerHigh] == 0)
                pointerHigh--;

            if (pointerLow == 101 || pointerHigh == 0)
                break;
            
            count = min(tally1[pointerLow], tally2[pointerHigh]);
            totalProductSum += count * pointerLow * pointerHigh;
            tally1[pointerLow] -= count;
            tally2[pointerHigh] -= count;
        }
        
        return totalProductSum;
    }
};

To minimize the product sum of two arrays using C++, the given solution implements an efficient approach using frequency counting and pointer manipulation, which avoids direct array sorting and thus minimizes time complexity.

*Start by initializing two frequency arrays, tally1 and tally2, each of size 101 (assuming the array values range from 1 to 100). *Iterate over arr1 and arr2 to populate tally1 and tally2 with the count of each element appearing in arr1 and arr2, respectively. *Define two pointers, pointerLow starting from 1 (the lowest possible value) and pointerHigh starting from 100 (the highest possible value). *Initialize totalProductSum to store the result of the minimum product sum. *Use a loop to process elements from the lowest and highest ends of the range toward the middle: *Increment pointerLow until an element with a non-zero count is found in tally1. *Decrement pointerHigh until an element with a non-zero count is found in tally2. *If either pointer runs out of elements (pointerLow exceeds 100 or pointerHigh drops below 1), exit the loop. *Calculate the minimum count of matching pairs from tally1[pointerLow] and tally2[pointerHigh] and update the totalProductSum accordingly. *Decrement the counts in tally1 and tally2 by the number of pairs processed. *Return totalProductSum.

This method ensures that the product sum is minimized by pairing the smallest elements in arr1 with the largest elements in arr2, leveraging the count rather than the original array indices, which would require a more directly computational approach.

java
class Solution {
    public int calculateMinProductSum(int[] arr1, int[] arr2) {
        int[] count1 = new int[101], count2 = new int[101];

        for (int val : arr1)
            count1[val]++;
        for (int val : arr2)
            count2[val]++;
        
        int i = 0, j = 100, result = 0;
        int occurrences;
        
        while (i < 101 && j > 0) {
            while (i < 101 && count1[i] == 0) 
                i++;

            while (j > 0 && count2[j] == 0)
                j--;

            if (i == 101 || j == 0)
                break;

            occurrences = Math.min(count1[i], count2[j]);
            result += occurrences * i * j;
            count1[i] -= occurrences;
            count2[j] -= occurrences;
        }

        return result;
    }
}

This guide explains how to compute the minimum product sum of two arrays using Java, by pairing elements from both arrays such that the overall sum of products is minimized. The supplied Java function calculates this value effectively through the following approach:

  • Define two arrays, count1 and count2, with each index representing possible values in arr1 and arr2 respectively and storing their frequencies.

  • Initialize pointers i and j to iterate through count1 from start and count2 from end, optimizing for minimum product by considering the smallest and largest available values.

  • Loop through both arrays using i and j. Skip any indices with a frequency of zero to find the next available numbers from arr1 and arr2.

  • For valid pairs of indices i and j, calculate the possible number of pairings as the minimum occurrence of i in arr1 and j in arr2.

  • Accrue the product of these paired values to result, and decrement the frequencies from count1 and count2 accordingly.

  • Continue the process until one of the pointers either exceeds the number bounds or there are no more elements to pair.

  • Return the calculated result as the minimum product sum.

This approach leverages frequency count and the limits of the problem constraints (values ranging from 1 to 100), ensuring that the algorithm is efficient and easy to implement for the given problem statement.

python
class Solution:
    def minimumProductSum(self, a: List[int], b: List[int]) -> int:
        # Frequency tables for both arrays
        freqA, freqB = [0] * 101, [0] * 101

        # Calculate frequency of each element in both arrays
        for x in a:
            freqA[x] += 1
        for x in b:
            freqB[x] += 1
        
        # Pointers for frequency tables
        i, j = 1, 100
        result = 0
        
        # Use two pointers to find minimal product sum
        while i <= 100 and j > 0:
            # Advance pointer i if no elements exist in freqA at position i
            while i <= 100 and freqA[i] == 0:
                i += 1
            # Decrease pointer j if no elements exist in freqB at position j
            while j > 0 and freqB[j] == 0:
                j -= 1

            # Exit condition if pointers exceed the range
            if i == 101 or j == 0:
                break

            # Calculate the minimum occurrence of current elements at pointer positions
            occurrences = min(freqA[i], freqB[j])
            # Calculate product and add to result
            result += occurrences * i * j
            # Decrease frequencies by the number of used occurrences
            freqA[i] -= occurrences
            freqB[j] -= occurrences
        
        # Return the total minimal product sum
        return result

The provided code in Python addresses the problem of minimizing the product sum of two arrays. Here is an outline of how the solution works:

  • Initialization of two frequency arrays, freqA and freqB, to count the occurrences of each number (ranging from 1 to 100) in the respective input lists a and b.

  • Two pointers, i starting at 1 for array a and j starting at 100 for array b, are employed. The idea is to multiply the smallest element in a with the largest element in b to get the smallest products.

  • A while loop runs as long as i is less than or equal to 100 and j is greater than 0. Inside the loop, the code adjusts the pointers i and j to skip indices where the frequency is zero.

  • The minimal number of occurrences between the current elements at pointers i and j is computed. This number dictates how many times the product of i and j should be added to the result.

  • The product of the current values pointed by i and j, multiplied by their occurrences, is added to the result.

  • The frequencies at the respective indices are decremented by the number of used occurrences.

  • The loop continues until one of the pointers moves outside the valid range, at which point the sum of products is returned as the minimal product sum.

This solution efficiently calculates the minimum product sum by strategically pairing elements of the two arrays through managing their values and occurrences. The approach uses simple arithmetic and array manipulation, grounded in pointer and frequency table concepts.

Comments

No comments yet.