【发布时间】:2018-03-24 07:38:15
【问题描述】:
我刚刚做了这个样本测试,大部分情况下都是正确的,但我不知道为什么我会弄错这两个案例。
给出了一个由 N 个整数组成的非空零索引数组 A。 数组 A 代表磁带上的数字。
任何整数 P,例如 0 1, ..., A[P − 1] 和 A[P], A[P + 1], ..., A[N - 1]。
两部分的区别在于:|(A[0] + A1 + ... + A[P - 1]) - (A[P] + A[P + 1] + ... + A[N - 1])|
换句话说,它是总和之间的绝对差 第一部分和第二部分的总和。
例如,考虑数组 A,这样:
A[0] = 3 A1 = 1 A[2] = 2 A[3] = 4 A[4] = 3 我们可以拆分 这个磁带在四个地方:
P = 1,差值 = |3 − 10| = 7 P = 2,差值 = |4 - 9| = 5个 = 3、差值 = |6 − 7| = 1 P = 4,差值 = |10 - 3| = 7 写一个 功能:
类解决方案 { public int solution(int[] A); }
给定一个由 N 个整数组成的非空零索引数组 A,返回 可以达到的最小差异。
例如,给定:
A[0] = 3 A1 = 1 A[2] = 2 A[3] = 4 A[4] = 3 函数 应该返回 1,如上所述。
假设:
N 是 [2..100,000] 范围内的整数;数组 A 的每个元素 是 [−1,000..1,000] 范围内的整数。复杂性:
预期的最坏情况时间复杂度为 O(N);预期最坏情况空间 复杂度是 O(N),超出输入存储(不计算存储 输入参数所必需的)。
class Solution {
public int solution(int[] A) {
int sum = 0;
int subtracted = 0;
int minDiff = 100000;
for (int i = 0; i < A.length; i++) {
sum += A[i];
}
for (int i = 0; i < A.length; i++) {
sum -= A[i];
subtracted += A[i];
int diff = (Math.abs(sum - subtracted));
if (minDiff > diff) {
minDiff = diff;
}
}
return minDiff;
}
}
冷态结果
【问题讨论】:
-
第二个循环应该是
i < A.length - 1,你不希望磁带的一侧什么都没有。因此,您的代码对于 [-1000, 1000] 失败,您将返回 0 但应该返回 2000。 -
你不能扩展失败的测试看看它们是什么吗?