This question already has answers here:
Finding minimal absolute sum of a subarray
(10个答案)
嗨,我参加了两次密码测试,得了0分。请帮助我使用javascript解决问题。
给出了一个由n个整数组成的非空数组a。一对整数(p,q),使得0≤p≤q最小abs切片的绝对和最小。
例如,数组A使:
其中包含以下切片:
(0,1),其绝对和为=2+(-4)=2
(0,2),其绝对和为| 2+(-4)+6 |=4
(0,3),其绝对和为=2+(-4)+6+(-3)=1
(1,3),其绝对和为=(-4)+6+(-3)=1
(1,4),其绝对和为=(-4)+6+(-3)+9=8
(4,4),其绝对和为9=9
切片(0,3)和(1,3)都是最小abs切片,它们的绝对和等于1。
编写函数:
如果给定一个由n个整数组成的非空数组a,则返回min abs slice的绝对和。
为以下假设编写一个有效的算法:
N是[1..1000000]范围内的整数;
数组A的每个元素都是一个整数,其范围为[-10000..10000];
以下是我的解决方案:
(10个答案)
嗨,我参加了两次密码测试,得了0分。请帮助我使用javascript解决问题。
给出了一个由n个整数组成的非空数组a。一对整数(p,q),使得0≤p≤q最小abs切片的绝对和最小。
例如,数组A使:
A[0] = 2
A[1] = -4
A[2] = 6
A[3] = -3
A[4] = 9
其中包含以下切片:
(0,1),其绝对和为=2+(-4)=2
(0,2),其绝对和为| 2+(-4)+6 |=4
(0,3),其绝对和为=2+(-4)+6+(-3)=1
(1,3),其绝对和为=(-4)+6+(-3)=1
(1,4),其绝对和为=(-4)+6+(-3)+9=8
(4,4),其绝对和为9=9
切片(0,3)和(1,3)都是最小abs切片,它们的绝对和等于1。
编写函数:
function solution(A);
如果给定一个由n个整数组成的非空数组a,则返回min abs slice的绝对和。
为以下假设编写一个有效的算法:
N是[1..1000000]范围内的整数;
数组A的每个元素都是一个整数,其范围为[-10000..10000];
以下是我的解决方案:
function solution(A, i = 0, sum = 0) {
const N = A.length;
if (N === 0) {
return 0;
}
if (N == 1) {
return Math.abs(A[0]);
}
A.sort();
// All positives
if (A[0] >= 0 && A[N - 1] >= 0) {
return Math.abs(A[0]);
}
// All Negatives
if (A[0] <= 0 && A[N - 1] <= 0) {
return Math.abs(A[N - 1]);
}
let currAbsSum = 0;
let minAbsSum = Number.MAX_SAFE_INTEGER;
for (var i = 0; i < N; i++) {
let j = N - 1;
while (j >= i) {
currAbsSum = Math.abs(A[i] + A[j]);
if (currAbsSum === 0) {
return 0;
}
minAbsSum = Math.min(currAbsSum, minAbsSum);
if (Math.abs(A[i]) > Math.abs(A[j])) {
i++;
} else {
j--;
}
}
if (A[i] > 0) break;
}
return minAbsSum;
}
最佳答案
下面是一个javascript版本的O(n logn)答案,取自here:
function solution(A) {
let sums = new Array(A.length + 1);
let minAbsSum = Number.MAX_SAFE_INTEGER;
sums[0] = 0;
for (var i = 0; i < A.length; i++) {
sums[i + 1] = A[i] + sums[i];
}
sums.sort();
for (var i = 1; i < sums.length; i++) {
minAbsSum = Math.min(minAbsSum, Math.abs(sums[i] - sums[i - 1]));
}
return minAbsSum;
}
console.log(solution([2, -4, 6, -3, 9]))
console.log(solution([10, 10, 10, 10, 10, -50]))
10-06 02:07