给出一个由 N 个整数组成的非空数组 A。数组 A 代表磁带上的数字。
任何整数 P,使得 0 < P < N,将该磁带分割成两个非空部分:A[0]、A[1]、...、A[P − 1] 和 A[P]、A[ P + 1],...,A[N − 1]。
两部分之间的差异是以下值:|(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,返回可以实现的最小差异。
例如,给定:
A[0] = 3
A[1] = 1
A[2] = 2
A[3] = 4
A[4] = 3
该函数应返回 1,如上所述。
为以下假设编写一个有效的算法:
N是[2..100,000]范围内的整数;数组 A 的每个元素都是 [−1,000..1,000] 范围内的整数。
针对上述问题,我尝试了以下方法,
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);
由于上面的工作正常,但其时间复杂度达到了O(N*N)不可接受的程度。请帮忙了解哪种算法适合这个问题。
慕莱坞森
蓝山帝景
相关分类