Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 求数组中的绝对最小值_Java_Arrays_Algorithm - Fatal编程技术网

Java 求数组中的绝对最小值

Java 求数组中的绝对最小值,java,arrays,algorithm,Java,Arrays,Algorithm,给出了一个由N个整数组成的非空数组A。数组A表示磁带上的数字 任何整数p,使得0

给出了一个由N个整数组成的非空数组A。数组A表示磁带上的数字

任何整数p,使得0 这两部分之间的差异是:
|(A[0]+A[1]+…+A[p− 1]) − (A[P]+A[P+1]+…+A[N− 1] )|

换句话说,它是第一部分和第二部分之和之间的绝对差值

例如,考虑数组A这样:

A[0] = 3
A[1] = 1
A[2] = 2
A[3] = 4
A[4] = 3
我们可以将此磁带分为四个位置:

 P = 1, difference = |3 − 10| = 7
 P = 2, difference = |4 − 9| = 5
 P = 3, difference = |6 − 7| = 1
 P = 4, difference = |10 − 3| = 7
编写一个函数:

  class Solution { public int solution(int[] A); }
给定一个由N个整数组成的非空数组,返回可以达到的最小差值

例如,假设:

A[0] = 3
A[1] = 1
A[2] = 2
A[3] = 4
A[4] = 3
如上所述,函数应返回1

为以下假设编写有效的算法:

N是[2..100000]范围内的整数; 数组A的每个元素都是范围内的整数[−1000..1000]

对于上述问题,我尝试了以下方法

    int firstSum = 0;
    int secondSum = 0;
    int tot = Integer.MAX_VALUE;
    List<Integer> col = new ArrayList<>();

    int k=0;
    while(m<A.length)
    {

        firstSum = firstSum + A[k]; 
        for(int i=m; i<A.length; i++)
        {
            secondSum = secondSum + A[i];
        }
        k++;
    }


    System.out.println("Min DIfference: " +tot);
int firstSum=0;
int secondSum=0;
int tot=整数最大值;
List col=new ArrayList();
int k=0;

虽然(m可能是,但以下方法有助于提高复杂性:

首先,我将对元素进行累加,例如,对于上面的示例,如下所示:

int[] A = {3,1,2,4,3};

for(int i = 1; i< A.length; i++){
    A[i] = A[i-1]+A[i];
}
public static int solution(int[] A){
    for(int i = 1; i< A.length; i++){
        A[i] = A[i-1]+A[i];
    }
    System.out.println(Arrays.toString(A));
    int min = Integer.MAX_VALUE;
    for(int i = 0; i< A.length-1; i++){
        if(Math.abs(A[i]-A[A.length-1]+A[i]) < min){
            min = Math.abs(A[i]-A[A.length-1]+A[i]);
        }
    }
    return min;
}
在第二个循环中,计算索引
[a.length-1]
每个索引
i

|A[i] - (A[A.length-1] + A[i])|
您的方法可能类似于:

int[] A = {3,1,2,4,3};

for(int i = 1; i< A.length; i++){
    A[i] = A[i-1]+A[i];
}
public static int solution(int[] A){
    for(int i = 1; i< A.length; i++){
        A[i] = A[i-1]+A[i];
    }
    System.out.println(Arrays.toString(A));
    int min = Integer.MAX_VALUE;
    for(int i = 0; i< A.length-1; i++){
        if(Math.abs(A[i]-A[A.length-1]+A[i]) < min){
            min = Math.abs(A[i]-A[A.length-1]+A[i]);
        }
    }
    return min;
}

使用前缀和的概念可以降低时间复杂度

使用两个前缀和数组:

1) 前向\u前缀\u和(数组元素从左到右的和)

2) 反向前缀和(数组元素从右到左的和)

最后,遍历数组以计算最小差异


answer=min(abs(前向前缀和[i]-后向前缀和[i]))
(0为什么会有这么多接近票数的人?@OleV.V.不,当然不是,先生,我尝试了一些算法,但我能得到的最好结果只是上面的。显然你不是在寻找编码方面的帮助。对我来说,这似乎是一个算法和数学问题。这不是一个很小的问题吗?@OleV.V.是的,它也可以由负值组成。很好,我有n敲了我的头很长时间,非常感谢。你介意分享一下这背后的思想过程吗?你遵循了什么算法吗?