最大数组变量之和的绝对差异

时间:2013-06-13 03:06:39

标签: algorithm data-structures

有N个号码。 一个[0],A [1],A [2],[3],...,一个[N]

分为两个阶段: -

阶段1: - 从[i]到[j]找到数组中的元素总和。

阶段2: - 从[m]到[n]找到数组中的元素总和。

1≤i≤j<1。 m≤n≤N。

2≤N≤10000

-10 ^ 9&lt; = a [N]&lt; = 10 ^ 9。

我必须计算其总值,由两个阶段中获得的值之间的绝对差值确定,并且该总值应该最大化。

例如,

N = 4
1 1 -1 -1

i = 1,j = 2,k = 3,l = 4。 由此获得的最大总值是| ((-1)+( - 1)) - (1 + 1)| = 4。

这是我试图解决的问题,我是新手,我不知道如何解决这个问题,请指导我使用哪种算法。如何找到i,j,m和n的条件

1 个答案:

答案 0 :(得分:0)

在浮点数中为-10 ^ 9&lt; = a [N]&lt; = 10 ^ 9,使用堆来避免精度损失

如果您不知道什么是堆及其操作,您可以在大多数算法书籍和网页上找到它们。

这里是伪代码,我认为给出了i,j,m,n:

build a[i...j] to a max-heap heap1;
build a[m...n] to a min-heap heap2;
size1 = j-i+1;
size2 = n-m+1;
while(size1>1) {
    n1 = extractmax();
    n2 = extractmax();
    temp = n1+n2;
    insert(heap1,temp)
}
//do the same thing to heap2,but use extractmin() instead of extractmax()

result = abs(a[i])+a[m];

如果没有给出i,j,m,n,则通过分区找到它们,这是快速排序的典型部分。

例如

a[0] = 0;
i=j=0;//a[0] is useless, and 1 ≤ i ≤ j < m ≤ n ≤ N
m=n=N;
if(a[N]<=0)
    temp = a[N];
a[N] = -1;
//pre: a[i...j] is non-positive
       a[m...n] is non-negetive

while(j<=m+1){
    while(a[j+1]<=0)
        j++;
    while(a[m-1]>=0)
        m--;
    if(j+1>m)
        break;
    swap(a[j+1],a[m-1]);
    j++;m--;
}
if(temp<=0) { //insert a[N] back
    a[N] = a[m];
    a[m] = temp;
    j = m;
    m++;
}

//then you will have checked all elements
//and make sure that non-positive elements are consecutive
//so as to non-negative elements
//now you have i,j,m,n to run pseudo-code at the beginning.
//although i,j may be not more than 0,it depends on the data in your array.