[算法系列]-关于返回多维数组中最大数值问题

问题描述

今天想要和大家分享的是有关于返回多维数组中最大值问题。这样描述可能会有些抽象,举个例子大家就会明白了。。例如: 多维数组[13, 27, 18, 26], [4, 5, 1, 3], [32, 35, 37, 39], [1000, 1001, 857, 1]]的返回值为[27,5,39,1001],即返回多维数组每一项的最大值。

好了,大家可以先自己思考一下解决方案,下面我就要和大家分享几种解决方案。

解决方案

自定义 sort() 方法

想要先和大家说一下我的第一想法,思路如下:

  • 获取多维数组中每一项的最大值,这里使用自定义 sort() 方法进行一维数组的降序排序。
  • 使用push()方法建立一个新数组,用作函数返回值。

代码如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
function largestOfFour(arr) {
var newArr = [];
for(var i = 0;i<arr.length;i++){
arr[i].sort(function(a,b){
return b-a;
});
newArr.push(arr[i][0]);
}
return newArr;
}

largestOfFour([[13, 27, 18, 26], [4, 5, 1, 3], [32, 35, 37, 39], [1000, 1001, 857, 1]]); // [27,5,39,1001]

使用嵌套for循环

思路分解:

  • 使用嵌套for循环进行判断,获取多维数组每一项的最大值

这种方法是最基础的,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
function largestOfFour(arr) {  
var largest = [0, 0, 0, 0];

for(var i = 0; i < arr.length; i++){
for(var j = 0; j < arr[i].length; j++){
if(largest[i] < arr[i][j]){
largest[i] = arr[i][j];
}
}
}
return largest;
}
largestOfFour([[13, 27, 18, 26], [4, 5, 1, 3], [32, 35, 37, 39], [1000, 1001, 857, 1]]); // [27,5,39,1001]

map() + Math.max() + apply()

由于 Math.max() 方法不接收数组参数,这里巧用了 Math.max() + apply() 方法。其代码如下:

1
2
3
4
5
6
7
function largestOfFour(arr) {  
return arr.map(function(num) {
return Math.max.apply(null, num);
});
}

largestOfFour([[13, 27, 18, 26], [4, 5, 1, 3], [32, 35, 37, 39], [1000, 1001, 857, 1]]); // [27,5,39,1001]

最佳解决方案

1
2
3
4
5
function largestOfFour (arr) {
return arr.map(Function.apply.bind(Math.max, null));
}

largestOfFour([[13, 27, 18, 26], [4, 5, 1, 3], [32, 35, 37, 39], [1000, 1001, 857, 1]]); // [27,5,39,1001]

是不是这种方法一眼望去和上一种方法有很大的相似之处,,嘻嘻,是的呀,运用的方法都一样,只不过这种方法使用了 bind() 方法,但是我感觉其基本思路都是一样子的。

小结

不知道大家有没有更好的解决方案,如果有的话,请在下面留言,大家一起分享呀 ~~