查找最大值比较每个索引的多个数组

Posted

技术标签:

【中文标题】查找最大值比较每个索引的多个数组【英文标题】:Find max value comparing multiple arrays for each index 【发布时间】:2015-01-22 21:00:04 【问题描述】:

我正在尝试找到一种方法来找到最大值,比较数组中每个观察值的多个(未知数,但长度相同)数组,返回一个具有最大值的数组。

例子:

编辑

 A = [[2.2, 3.3, 1.3], [1.2, 5.3, 2.2], [0.3, 2.2, 5.2], etc......]

返回

MAX = [2.2, 5.3, 5.2]

能够检查“输入”数组的长度是否相同,但无法比较找到最大值的数组......?

【问题讨论】:

你不是说MAX = [3.3,5.3,5.2]吗? @Fresheyeball:不,我想比较 A[0] 与 B[0] 与 C[0].. 以及 A[1] 与 B[1] 与 C[1] 等..不是在每个数组中找到最大值,而是在数组中找到 0:length-1... 你应该将数组转发给函数查找最大数。 @DiKey:有点我做不到的事情。你能举个例子吗? 【参考方案1】:

对于数组的每个索引,创建一个包含“列”中所有元素的数组,并找到这些值的最大值。返回生成的数组。示例用法:maxValues(A) 会给出想要的结果。

function maxValues(array) 
    var maxArray = [];
    var length = array[0].length;
    for (var i = 0; i < length; i++) 
        var ithColumn = [].map.call(array, function(array) 
            return array[i];
        );
        maxArray.push(Math.max.apply(null, ithColumn));
    
    return maxArray;

【讨论】:

感谢打开或关闭!请有人为正确答案投票。【参考方案2】:
var data = [
    [2.2, 3.3, 1.3],
    [1.2, 5.3, 2.2],
    [0.3, 2.2, 5.2]
];

function maxAtIndex (data) 
    //output
    var maxArray = [];
    //loop arrays passed in
    for (var i = 0; i < data[0].length; i++) 
        var possibleValues = [];
        //get value in array at index
        for (var j = 0; j < data.length; j++) 
            possibleValues.push(data[j][i]);
        
        //get the highest from possible values
        var highest = Math.max.apply(null, possibleValues);
        //store in output array
        maxArray.push(highest);
    
    return maxArray;
;

console.log(maxAtIndex(data)); //[ 2.2, 5.3, 5.2 ]

【讨论】:

感谢 jmfolds!请有人为正确答案投票【参考方案3】:

你可以使用Array.reduce():

    var A = [[2.2, 3.3, 1.3], [1.2, 5.3, 2.2], [0.3, 2.2, 5.2]];
    
    var max = A.reduce(function(final, current) 
      for (var i = 0; i < final.length; ++i) 
        if (current[i] > final[i]) 
          final[i] = current[i];
        
      
      return final;
    );
    
    console.log(max);

内部函数将当前最大值与下一个数组元素进行比较,因此final 始终保存迄今为止遍历的所有元素的最大值。

【讨论】:

【参考方案4】:

您只需几行代码即可将 Lo-Dash 的 zip 和 map 方法组合起来:

var A = [[2.2, 3.3, 1.3], [1.2, 5.3, 2.2], [0.3, 2.2, 5.2]];

// Creates an array of arrays, where the first array is all the first elements,
// the second array is all the second elements, etc.
var zipped = _.zip(A);
var maxes = _.map(zipped, function(arr) 
    return _.max(arr);
);
console.log(maxes);

【讨论】:

您的回答中有一个错字:因为 lodash 的 _.zip 界面已更改,您必须使用 _.zip.apply(null, A) 应用它。【参考方案5】:

这是一个简短而甜蜜的版本:

var A = [[2.2, 3.3, 1.3], [1.2, 5.3, 2.2], [0.3, 2.2, 5.2]];

var maxA = A.map(a => Math.max.apply(null, a));

【讨论】:

【参考方案6】:

我采用了Tom Panning's answer 并进一步简化了它:

var A = [[2.2, 3.3, 1.3], [1.2, 5.3, 2.2], [0.3, 2.2, 5.2]];
var MAX = _.zip.apply(null, A).map(_.max);

【讨论】:

以上是关于查找最大值比较每个索引的多个数组的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode:至少是其他数字两倍的最大数

c语言 查找最大元素

查找最大索引 j 的有效算法,使得从索引 i 到 j 的总和小于 k

如何在排序数组中查找第一次出现最大值的索引

在子数组列表中创建并查找最大值

查找数组中最大数字的索引