数组子序列的最大可能平均值-需要有效的解决方案

JavaLearner:

输入项

1: array size (1 to 10^5)
2: Number to take average (1 to 10^3)
3: elements in array (1 to 10^5) Non sorted, any order is possible

输出:任何子阵列的最大可能平均值。

Eg:
5 3
1 2 3 4 5
o/p = 5

5 4
1 2 3 4 5
o/p = 3

for first example seq will be sum[0,4]=15 and its average with 3 will be 5.
for second example seq will be sum[2,4]=12 and its average with 4 will be 3.

我已经在下面给出了o(n ^ 2)的解决方案,但不适用于大输入。

            long max = 0;
            for( int m = 0; m < people; m++ )
            {
                long sum = 0;
                for( int n = m; n < people; n++ )
                {
                    sum = sum + chocolateArray[n];
                    if( sum % boxes == 0 )
                    {
                        if( ( sum / boxes ) > max )
                        {
                            max = sum / boxes;
                        }
                    }
                }
            }
            System.out.println( max );

这里people是数组大小,boxes是平均数,chocolateArray是原始数组。

请提供有效的解决方案。我以为可以解决这个问题,dynamic programming但是创建尺寸为10 ^ 5的二维数组会导致内存不足的问题。

正义:

由于所有数字均为正数,因此唯一有效的约束条件是可除性。因此,问题是要求出最大的子数组总和,该总和可以被m盒数整除

这可以通过以下方式完成:创建一个累加和的数组modulo m,然后找到两个具有相同数字的位置,并尽可能地隔开。由于最多有一个m值,因此我们可以简单地存储每个可能残基的最小和最大索引,然后取具有最大子数组总和的一个。下面的代码可以做到这一点。

cumsum = int[people+1];
minPos = int[boxes];
maxPos = int[boxes];
Arrays.fill(minPos, -1);
Arrays.fill(maxPos, -1);
int residue = 0;
for(int i=0; i<people; i++){
    cumsum[i+1] = cumsum[i] + chocolateArray[i]; // For simplicity the array length is 1 longer
    residue = cumsum[i+1] % boxes;
    if(minPos[residue] == -1) minPos[residue] = i;
    maxPos[residue] = i;
}
int max = 0;
for(int i=0; i<boxes; i++){
    int sum = cumsum[maxPos[i]+1] - cumsum[minPos[i]+1];
    if(sum > max){
        max = sum;
    }
}
System.out.println(max/boxes);

例如:

人= 5 
盒= 4 
数组= [1、2、3、4、5] 
累积= [ 
1、3、6、10、15 ] 
残留= [ 1、3、2、2、3 ] MinMaxPos [0] = (-1,-1)-> sum = 0-> avg = 0 
MinMaxPos [1] =(0,0)-> sum = 0-> avg = 0 0 
MinMaxPos [2] =(2,3)-> sum = 4->平均= 1 
MinMaxPos [3] =(1,4)->总和= 12->平均= 3

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

可能更简单的O(n)解决方案来找到具有最大平均值的长度为K(或更大)的子数组

按组(递归地)用滞后平均值替换 NA 的有效解决方案

javascript:基于数组,有效的解决方案替换字符串中的值

在 Javascript 中查找重复对象或数组的更有效解决方案?

是否有线性解决方案来确定后置订单序列是否为有效的BST?

计算数组中所有对和平方和的有效解决方案是什么?

在NumPy ndArray中基于布尔值找到最长序列的更有效解决方案

我正在为数组开发一种基本的排序算法,尽管该解决方案有效,但我还不太了解

需要有效的解决方案才能在自定义应用程序中使用Android模式锁定屏幕(而不是源代码重定向)

从给定数组的所有子间隔中找到最大可能差值之和

需要有效地将数百万个时间序列数据插入Cassandra DB的建议

N数组解决方案的子集总和,需要动态解决方案

查找具有公共密钥的哈希数组的最大,最小和平均值?

转换熊猫数据框:需要更有效的解决方案

用 Javascript 中的解决方案来处理菊花链三元数组和平均值?

通过对象属性(对象数组)获得平均值的最有效方法

如何有效地获取HashMap数组中几个HashMap的平均值?

使用尾递归更有效的解决方案?

Javascript sin()和cos()的有效解决方案?

R:比此for循环更有效的解决方案

Hackerrank 不接受有效的解决方案

如何使一个递归解决方案返回所有可能的解决方案?

为什么我的解决方案有效,而其他解决方案却无效?

找出连续数组子序列最大值的更好解决方案

使用平均值返回“序列没有元素”

如何(有效)计算向量的移动平均值?

有效计算平均值和中位数

查找跨列位平均值的有效方法

如何快速有效地计算平均值(移动平均值)?