繁体   English   中英

在删除数组中的 K 个连续元素后找到最小幅度

[英]Find the min amplitude after removing K consecutive elements in an array

我试图在 JavaScript 中找到解决这个问题的方法,时间复杂度为 O(N)。

问题:给定一个由 N 个正整数和一个整数 k 组成的数组 A。 您想从 A 中删除 k 个连续元素,以使剩余元素的幅度最小。 振幅是最小元素和最大元素之间的差值。

For eg. A[] = [8,7,4,1] and k=2. Output should be 1 because we will remove 4 and 1.

蛮力解决方案很简单。 可以在 O(n) 中完成吗? 谢谢

这对你有帮助吗? 我首先确定 3 个最大的数字(3,因为我们删除了 2 个连续的数字,这 2 个数字可能是 2 个最大的数字,所以我们需要下一个最大的数字),然后我们对 3 个最小的数字执行相同的操作。

我们创建了一个删除连续数字的数组,而不改变原始数组。

然后我们只需运行一些 if else 语句来确定 max, min 是否包含在删除的连续数字中

虽然它不是最漂亮的。 很多 if/else

 const arr = [8, 7, 4, 1] const arr2 = [8, 7, 4, 1, 4, 6, 8] const arr3 = [8, 7, 4, 1, 4, 6, 8, 3, 11, 4, 15] function slice2Consecutive(arr) { let newArr = [] for (let i = 0; i < arr.length - 1; i++) { let s1 = arr[i] let s2 = arr[i + 1] newArr.push([arr[i], arr[i + 1]]) } return newArr } function maxThree(arr) { let one = -Infinity; let two = -Infinity; let three = -Infinity; for (let i = 0; i < arr.length; i += 1) { let num = arr[i]; if (num > three) { if (num >= two) { three = two; if (num >= one) { two = one; one = num; } else { two = num; } } else { three = num; } } } return [one, two, three] } function minThree(arr) { let one = +Infinity; let two = +Infinity; let three = +Infinity; for (let i = 0; i < arr.length; i += 1) { let num = arr[i]; if (num < three) { if (num <= two) { three = two; if (num <= one) { two = one; one = num; } else { two = num; } } else { three = num; } } } return [one, two, three] } function minAmplitude(arr) { const [max, secondMax, thirdMax] = maxThree(arr) const [min, secondMin, thirdMin] = minThree(arr) const slicedArr = slice2Consecutive(arr) const amplitudeArr = [] for (let i = 0; i < slicedArr.length; i++) { let m = max let n = min if (slicedArr[i][0] === max || slicedArr[i][1] === max) { if (slicedArr[i][0] === secondMax || slicedArr[i][1] === secondMax) { m = thirdMax } else { m = secondMax } } if (slicedArr[i][0] === min || slicedArr[i][1] === min) { if (slicedArr[i][0] === secondMin || slicedArr[i][1] === secondMin) { n = thirdMin } else { n = secondMin } } amplitudeArr.push(m - n) } return Math.min(...amplitudeArr) } console.log(minAmplitude(arr)) console.log(minAmplitude(arr2)) console.log(minAmplitude(arr3))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM