📌  相关文章
📜  将数组分解为最大数量的子数组,使它们的平均值相同

📅  最后修改于: 2022-05-13 01:57:51.945000             🧑  作者: Mango

将数组分解为最大数量的子数组,使它们的平均值相同

给定一个整数数组,任务是将数组划分为最大数量的子数组,使得所有子数组的平均值相同。如果无法分割,则打印“Not possible”。

例子:

Input : arr[] = {1, 5, 7, 2, 0};
Output : (0  1) 
         (2  4) 
Subarrays arr[0..1] and arr[2..4] 
have same average.

Input  : arr[] = {4, 6, 2, 4, 8, 0, 6, 2};    
Output : (0, 0)
         (1, 2)
         (3, 3)
         (4, 5)
         (6, 7)

Input : arr[] = {3, 3, 3};
Output : (0, 0)
         (1, 1)
         (2, 2)

Input  : arr[] = {4, 3, 5, 9, 11};
Output : Not possible

这个想法是基于这样一个事实,如果一个数组可以被划分为具有相同平均值的子数组,那么所有这些子数组的平均值必须与整体平均值相同。
1) 求整个数组的平均值。
2)再次遍历数组并跟踪当前子数组的平均值。一旦平均值与整体平均值相同,打印当前子数组并开始一个新的子数组。

该解决方案分为最大数量的子阵列,因为一旦我们发现平均值与整体平均值相同,我们就会开始一个新的子阵列。

C++
// C++ program to break given array into maximum
// number of subarrays with equal average.
#include
using namespace std;
 
void findSubarrays(int arr[], int n)
{
    // To store all points where we can break
    // given array into equal average subarrays.
    vector result;
 
    // Compute total array sum
    int sum = 0;
    for (int i = 0; i < n; i++)
        sum += arr[i];
 
    int curr_sum = 0;     // Current Sum
    int prev_index = -1;  // Index of previous subarray
 
    for (int i = 0; i < n ; i++)
    {
        curr_sum += arr[i];
 
        // If current point is a break point. Note that
        // we don't compare actual averages to avoid
        // floating point errors.
        if (sum * (i - prev_index) == curr_sum * n)
        {
            // Update current sum and previous index
            curr_sum = 0;
            prev_index = i;
 
            // Add current break point
            result.push_back(i);
        }
    }
 
    // If last break point was not end of array, we
    // cannot break the whole array.
    if (prev_index != n-1)
    {
        cout << "Not Possible";
        return;
    }
 
    // Printing the result in required format
    cout << "(0, " << result[0] << ")\n";
    for (int i=1; i


Java
// Java program to break given array into maximum
// number of subarrays with equal average.
import java.util.Vector;
class GFG {
 
static void findSubarrays(int arr[], int n)
{
    // To store all points where we can break
    // given array into equal average subarrays.
    Vector result = new Vector<>();
  
    // Compute total array sum
    int sum = 0;
    for (int i = 0; i < n; i++)
        sum += arr[i];
  
    int curr_sum = 0;     // Current Sum
    int prev_index = -1;  // Index of previous subarray
  
    for (int i = 0; i < n ; i++)
    {
        curr_sum += arr[i];
  
        // If current point is a break point. Note that
        // we don't compare actual averages to avoid
        // floating point errors.
        if (sum *(i - prev_index) == curr_sum*n)
        {
            // Update current sum and previous index
            curr_sum = 0;
            prev_index = i;
  
            // Add current break point
            result.add(i);
        }
    }
  
    // If last break point was not end of array, we
    // cannot break the whole array.
    if (prev_index != n-1)
    {
        System.out.println("Not Possible");
        return;
    }
  
    // Printing the result in required format
    System.out.print("(0, " + result.get(0) + ")\n");
    for (int i=1; i


Python3
# Python 3 program to break given array
# into maximum number of subarrays with
# equal average.
 
def findSubarrays(arr, n):
     
    # To store all points where we can break
    # given array into equal average subarrays.
    result = []
 
    # Compute total array sum
    sum = 0
    for i in range(0, n, 1):
        sum += arr[i]
 
    curr_sum = 0    # Current Sum
    prev_index = -1 # Index of previous subarray
 
    for i in range(0, n, 1):
        curr_sum += arr[i]
 
        # If current point is a break point.
        # Note that we don't compare actual
        # averages to avoid floating point errors.
        if (sum *(i - prev_index) == curr_sum * n):
             
            # Update current sum and
            # previous index
            curr_sum = 0
            prev_index = i
 
            # Add current break point
            result.append(i)
             
    # If last break point was not end of
    # array, we cannot break the whole array.
    if (prev_index != n - 1):
        print("Not Possible", end = " ")
 
    # Printing the result in required format
    print("( 0 ,", result[0], ")")
    for i in range(1, len(result), 1):
        print("(", result[i - 1] + 1, ",",
                            result[i],")")
 
# Driver Code
if __name__ == '__main__':
    arr = [4, 6, 2, 4, 8, 0, 6, 2]
    n = len(arr)
    findSubarrays(arr, n)
 
# This code is contributed by
# Sanjit_Prasad


C#
// C# program to break given array into maximum
// number of subarrays with equal average.
using System;
using System.Collections.Generic;
 
class GFG
{
 
static void findSubarrays(int []arr, int n)
{
    // To store all points where we can break
    // given array into equal average subarrays.
    List result = new List();
 
    // Compute total array sum
    int sum = 0;
    for (int i = 0; i < n; i++)
        sum += arr[i];
 
    int curr_sum = 0;     // Current Sum
    int prev_index = -1; // Index of previous subarray
 
    for (int i = 0; i < n ; i++)
    {
        curr_sum += arr[i];
 
        // If current point is a break point. Note that
        // we don't compare actual averages to avoid
        // floating point errors.
        if (sum *(i - prev_index) == curr_sum*n)
        {
            // Update current sum and previous index
            curr_sum = 0;
            prev_index = i;
 
            // Add current break point
            result.Add(i);
        }
    }
 
    // If last break point was not end of array, we
    // cannot break the whole array.
    if (prev_index != n-1)
    {
        Console.Write("Not Possible");
        return;
    }
 
    // Printing the result in required format
    Console.Write("(0, " + result[0] + ")\n");
    for (int i = 1; i < result.Count; i++)
        Console.Write("(" + (result[i-1] + 1) + ", "
            + result[i] + ")\n");
}
 
// Driver code
public static void Main()
{
    int []arr = {4, 6, 2, 4, 8, 0, 6, 2};
    int n = arr.Length;
    findSubarrays(arr, n);
}
}
 
// This code is contributed by PrinciRaj1992


Javascript


输出:

(0, 0)
(1, 2)
(3, 3)
(4, 5)
(6, 7)