任务给你一个排序的整数数组arr。它包含几个唯一的整数(负、正或零)。
您的任务是找到最大的d,使得a b c=d,其中a、b、c和d是arr的不同元素。如果没有找到这样的元素d,则返回null。
例子:
对于arr=[2,3,5,7,12],输出应该是12(这个数组正确传递了我的函数)
对于arr=[-100,-1,0,7,101],输出应该是0(这个不通过)
我可以进行正数检查,但我的函数因负数而严重失败
function findD(arr) {
myArr = arr.sort((a, b) => b - a);
for (var i = 0; i < myArr.length; i++) {
for (var k = i + 1; k < myArr.length - 2; k++) {
var j = k + 1,
d = myArr.length - 1;
while (j < d) {
let sum = myArr[k] + myArr[j] + myArr[d];
if (sum == myArr[i]) {
return myArr[i];
} else if (sum < myArr[i]) {
d--;
} else if (sum > myArr[i]) {
j++;
}
}
}
}
return null
}
如何处理数组中的负值?
我把Renaldo建议的函数从https://www.geeksforgeeks.org/find-largest-d-in-array-such-that-a-b-c-d/翻译成了JavaScript。
function findLargestd(S, n){
var found = false;
// sort the array in
// ascending order
S.sort((a, b) => a - b);
// iterating from backwards to
// find the required largest d
for(var i = n - 1; i >= 0; i--){
for(var j = 0; j < n; j++){
// since all four a, b, c,
// d should be distinct
if(i == j){
continue;
}
for(var k = j + 1; k < n; k++){
if(i == k){
continue;
}
for(var l = k + 1; l < n; l++){
if(i == l){
continue;
}
// if the current combination
// of j, k, l in the set is
// equal to S[i] return this
// value as this would be the
// largest d since we are
// iterating in descending order
if(S[i] == S[j] + S[k] + S[l]){
found = true;
return S[i];
}
}
}
}
}
//if not found, return 0
if(found === false){
return 0;
}
}
假设有一个像< code>[-2,-1,0,3]这样的数组。
然后,按照您的算法按降序排序后,它将是[3,0,-1,-2]
。显然,您的算法将只选择3
,因为您假设d
必须大于其余3
位置的数字。当然,这是错误的。您不应该假设a
、b
和c
一定小于d
。这就是为什么当d
占据与a, b, c
相关的所有可能位置时,您必须检查其他情况。因此,首先考虑一种蛮力方法,它具有O(n^4)
时间和O(1)
空间复杂度:
...
for (var i = myArr.length; i >= 0 ; i--) {
for (var k = 0; k < myArr.length; k++) {
if (k == i) {
continue
}
for (var j = k + 1; j < myArr.length; j++) {
if (j == i) {
continue
}
for (var d = j + 1; d < myArr.length; d++) {
if (d == i) {
continue
}
if (myArr[i] == myArr[k] + myArr[j] + myArr[d]) {
return myArr[i]
}
}
}
}
}
return null
...
但是这个问题可以在O(n^2)
时间和O(n^2)
空间中解决。
首先,我们应该认识到。
因此,对于给定的数组 ar
和每对索引 i,j: i
然后,再次遍历每对索引
k,l
并检查总和映射
中是否存在键阿瑞[l] - 阿瑞[k]
(d - c
) 或阿瑞[k] - 阿瑞[l]
(c - d
)。如果是这样,并且索引 l,k
与 summap 中的
索引不同,则更新最大元素(如果它低于 arr[l])
。
function solve(arr) {
var sumsMap = {}
for (var i = 0; i < arr.length; i++) {
for (var j = i + 1; j < arr.length; j++) {
var sum = arr[i] + arr[j]
// several pairs of indices can correspond to the same summ so keep all of them
var mappedIndices = sumsMap[sum]
if (typeof mappedIndices == "undefined") {
mappedIndices = []
}
let pair = {}
pair.first = i
pair.second = j
mappedIndices.push(pair)
sumsMap[sum] = mappedIndices
}
}
var maxD = Number.MIN_SAFE_INTEGER
for (var k = 0; k < arr.length; k++) {
for (var l = 0; l < arr.length; l++) {
mappedIndices = sumsMap[arr[l] - arr[k]]
if (mappedIndices != undefined) {
// in the worst case, 4 pairs of indices may contain k or l but the fifth one won't as numbers in the array are unique and hence the same index can occur only twice
var steps = Math.min(5, mappedIndices.length)
for (var s = 0; s < steps; s++) {
var pair = mappedIndices[s]
if (pair.first != k && pair.first != l && pair.second != k && pair.second != l) {
maxD = Math.max(maxD, arr[l])
}
}
}
}
}
if (maxD == Number.MIN_VALUE) {
return -1
} else {
return maxD
}
}
document.write(solve([-100,-1,0,7,101] ))
document.write("<br>")
document.write(solve([-93,-30,-31,-32] ))
本文向大家介绍在数组中找到最大的d,使得C ++中的a + b + c = d,包括了在数组中找到最大的d,使得C ++中的a + b + c = d的使用技巧和注意事项,需要的朋友参考一下 假设我们有一组整数。我们必须找到一个数字“ d”,其中d = a + b + c,并且必须最大化(a + b + c),所有a,b,c和d都存在于集合中。该集合将至少容纳一个元素,最多可容纳1000个元素。每
我想用一个算法实现最大子数组问题,该算法表现为(n log n): 查找最大相邻子数组,或数组中相邻元素的最大和。 假设:并非所有元素都是负数 我有一些工作的解决办法;问题在于重叠中心数组,而适当的索引表示重叠子问题,一些数组得到正确的答案,而另一些数组没有得到正确的答案。 只是为了比较&为了确保正确性,我实现了一个被称为Kadane算法的解决方案(我认为复杂度为Omega(n))。 这是Kand
我正在制作一个数组,它从1-100生成随机数。然后,在最后,我将从列表中输出最大值和最小值。但是,我不知道如何找到/调用max和min,我尝试使用math方法函数(如math.min()),但我认为它对数组不起作用。这是我的代码(下划线是我想要调用最大值和最小值的地方,但我不知道如何调用)。 }
无向图有n个顶点和0条边。我们能画出的最大边数是多少,这样图形就保持断开连接。 我已经给出了一个解决方案,我们可以排除一个顶点,并且可以找到无向图的n-1个顶点之间的最大边数,这样图仍然保持不连通。 对于n个顶点为n(n-1)/2,对于n-1个顶点为(n-1)(n-2)/2。有更好的解决办法吗?
问题内容: 对于需要解决的问题之一,我使用for循环找到了数组的最大值,因此我尝试使用递归找到它,这就是我想出的: 因此它可以正常工作并获取最大值,但是我的问题是:对于基本情况,返回a [head]以及对于在开头处的值大于最后一个值的情况,可以吗? 问题答案: 您只需一个计数器即可轻松完成此操作,只需使用您这次想要比较的值的索引即可: 这样可以更好地显示正在发生的情况,并使用默认的“递归”布局,例