我尝试从下面提供的Codility中了解一个问题的解决方案,
对于给定的具有N个整数的数组A和来自集合{−1,1}的N个整数的序列S,我们定义val(A,S)如下:
val(A, S) = |sum{ A[i]*S[i] for i = 0..N−1 }|
(假设零个元素的总和等于零。)
对于给定的数组A,我们正在寻找使val(A,S)最小的序列S。
编写一个函数:
class Solution { public int solution(int[] A); }
在给定N个整数的数组A的情况下,对于集合{-1,1}中N个整数的所有可能序列S,从val(A,S)的所有可能值中计算val(A,S)的最小值。
例如,给定数组:
A[0] = 1
A[1] = 5
A[2] = 2
A[3] = -2
您的函数应返回0,因为对于S = [−1,1,--1,1],val(A,S)= 0,这是可能的最小值。
假使,假设:
N is an integer within the range [0..20,000];
each element of array A is an integer within the range [−100..100].
Complexity:
预期的最坏情况时间复杂度为O(N * max(abs(A))2); 预期的最坏情况下的空间复杂度为O(N + sum(abs(A)))(不计算输入参数所需的存储空间)。
我有最近几个小时想要了解的解决方案。
public static int solution(int[] A) {
int N = A.length;
int sum = 0;
int max = 0;
for (int i = 0; i < N; i++) {
A[i] = Math.abs(A[i]);
sum += A[i];
max = Math.max(A[i], max);
}
int[] counts = new int[max + 1];
for (int i = 0; i < N; i++) {
counts[A[i]] += 1;
}
int[] Total = new int[sum + 1];
Arrays.fill(Total, -1);
Total[0] = 0;
// Segment I
for (int i = 1; i <= max; i++) {
if (counts[i] > 0) {
for (int j = 0; j <= sum; j++) {
// j th index is zero or positive
if (Total[j] >= 0) {
Total[j] = counts[i];
}
// (i-j) th index is positive
else if ((j - i) >= 0 && Total[j - i] > 0) {
Total[j] = Total[j - i] - 1;
}
}
}
}
如果任何人都可以解释循环的最后两个部分中发生了什么,这将非常有帮助。我只想在几行文字中找到一个简短的解释。
慕村225694
相关分类