js 數組 數組 最大值、最小值 算法(轉載)

 

一:https://www.cnblogs.com/zhouyangla/p/8482010.htmljavascript

1.排序法

首先咱們給數組進行排序,能夠按照從小到大的順序來排,排序以後的數組中第一個和最後一個就是咱們想要獲取的最小值和最大值。css

排序咱們會用到數組的 sort 方法。html

var arr = [12,56,25,5,82,51,22]; arr.sort(function (a, b) { return a-b; }); // [5,12,22,25,51,56] var min = arr[0]; // 5 var max = arr[arr.length - 1]; // 56 

2.假設法

假設當前數組中的第一個值是最大值,而後拿這個最大值和後面的項逐一比較,若是後面的某一個值比假設的值還大,說明假設錯了,咱們把假設的值進行替換。最後獲得的結果就是咱們想要的。java

// 獲取最大值: var arr = [22,13,6,55,30]; var max = arr[0]; for(var i = 1; i < arr.length; i++) { var cur = arr[i]; cur > max ? max = cur : null } console.log(max); // 55 // 獲取最小值: var arr = [22,13,6,55,30]; var min = arr[0]; for(var i = 1; i < arr.length; i++) { var cur = arr[i]; cur < min ? min = cur : null } console.log(min) // 6 

3. 使用 Math 中的 max/min 方法

可使用apply來實現。apply傳入的是一個數組。es6

var arr = [22,13,6,55,30]; var max = Math.max.apply(null, arr); var min = Math.min.apply(null, arr); console.log(max, min) // 55,6 

4. 使用ES6的擴展運算符

var arr = [22,13,6,55,30]; console.log(arr.Math(...arr)); // 55 

二:https://www.cnblogs.com/chenmingchao/p/6382186.html

方法一:swift

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//最小值
Array.prototype.min = function () {
var  min = this [0];
var  len = this .length;
for  ( var  i = 1; i < len; i++){
if  ( this [i] < min){
min = this [i];
}
}
return  min;
}
//最大值
Array.prototype.max = function () {
var  max = this [0];
var  len = this .length;
for  ( var  i = 1; i < len; i++){
if  ( this [i] > max) {
max = this [i];
}
}
return  max;
}

若是你是引入類庫進行開發,懼怕類庫也實現了同名的原型方法,能夠在生成函數以前進行重名判斷:數組

1
2
3
4
5
if  ( typeof  Array.prototype[ 'max' ] == 'undefined' ) {
Array.prototype.max = function () {
... ...
}
}

方法二:app

用Math.max和Math.min方法能夠迅速獲得結果。apply能讓一個方法指定調用對象與傳入參數,而且傳入參數是以數組形式組織的。偏偏如今有一個方法叫Math.max,調用對象爲Math,與多個參數函數

1
2
3
4
5
6
Array.max = function ( array ){
return  Math.max.apply( Math, array );
};
Array.min = function ( array ){
return  Math.min.apply( Math, array );
};

可是,John Resig是把它們作成Math對象的靜態方法,不能使用大神最愛用的鏈式調用了。但這方法還能更精簡一些,不要忘記,Math對象也是一個對象,咱們用對象的字面量來寫,又能夠省幾個比特了。ui

1
2
3
4
5
6
7
8
Array.prototype.max = function (){
return  Math.max.apply({}, this )
}
Array.prototype.min = function (){
return  Math.min.apply({}, this )
}
[1,2,3].max() // => 3
[1,2,3].min() // => 1

方法三:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function  getMaximin(arr,maximin)
{
if (maximin== "max" )
{
return  Math.max.apply(Math,arr);
}
else  if (maximin== "min" )
{
return  Math.min.apply(Math, arr);
}
}
var  a=[3,2,4,2,10];
var  b=[12,4,45,786,9,78];
console.log(getMaximin(a, "max" )); //10
console.log(getMaximin(b, "min" )); //04

方法四:

1
2
3
var  a=[1,2,3,5];
alert(Math.max.apply( null , a)); //最大值
alert(Math.min.apply( null , a)); //最小值

多維數組能夠這麼修改:

1
2
3
4
var  a=[1,2,3,[5,6],[1,4,8]];
var  ta=a.join( "," ).split( "," ); //轉化爲一維數組
alert(Math.max.apply( null ,ta)); //最大值
alert(Math.min.apply( null ,ta)); //最小值

 

3、https://blog.csdn.net/weixin_41646716/article/details/80961755

 

 

Math.max

JavaScript 提供了 Math.max 函數返回一組數中的最大值,用法是:

Math.max([value1[,value2, ...]])

值得注意的是:

  1. 若是有任一參數不能被轉換爲數值,則結果爲 NaN。
  2. max 是 Math 的靜態方法,因此應該像這樣使用:Math.max(),而不是做爲 Math 實例的方法 (簡單的來講,就是不使用 new )
  3. 若是沒有參數,則結果爲 -Infinity (注意是負無窮大)

而咱們須要分析的是:

1.若是任一參數不能被轉換爲數值,這就意味着若是參數能夠被轉換成數字,就是能夠進行比較的,好比:

Math.max(true, 0) // 1
Math.max(true, '2', null) // 2
Math.max(1, undefined) // NaN
Math.max(1, {}) // NaN

2.若是沒有參數,則結果爲 -Infinity,對應的,Math.min 函數,若是沒有參數,則結果爲 Infinity,因此:

var min = Math.min();
var max = Math.max();
console.log(min > max);

瞭解了 Math.max 方法,咱們以求數組最大值的爲例,思考有哪些方法能夠實現這個需求。

原始方法

最最原始的方法,莫過於循環遍歷一遍:

var arr = [6, 4, 1, 8, 2, 11, 23];

var result = arr[0];
for (var i = 1; i < arr.length; i++) {
    result =  Math.max(result, arr[i]);
}
console.log(result);

reduce

既然是經過遍歷數組求出一個最終值,那麼咱們就可使用 reduce 方法:

var arr = [6, 4, 1, 8, 2, 11, 23];

function max(prev, next) {
    return Math.max(prev, next);
}
console.log(arr.reduce(max));

排序

若是咱們先對數組進行一次排序,那麼最大值就是最後一個值:

var arr = [6, 4, 1, 8, 2, 11, 23];

arr.sort(function(a,b){return a - b;});
console.log(arr[arr.length - 1])

eval

Math.max 支持傳多個參數來進行比較,那麼咱們如何將一個數組轉換成參數傳進 Math.max 函數呢?eval 即是一種

var arr = [6, 4, 1, 8, 2, 11, 23];

var max = eval("Math.max(" + arr + ")");
console.log(max)

apply

使用 apply 是另外一種。

var arr = [6, 4, 1, 8, 2, 11, 23];
console.log(Math.max.apply(null, arr))

ES6 ...

使用 ES6 的擴展運算符:

var arr = [6, 4, 1, 8, 2, 11, 23];
console.log(Math.max(...arr))

專題系列

JavaScript專題系列防抖、節流、去重、類型判斷、拷貝、最值、扁平、柯里、遞歸、亂序、排序等,特色是研(chao)究(xi) underscore 和 jQuery 的實現方式。

two:

 

使用遞歸函數

  1.  
    var arr = [ 9, 8, 55, 66, 49, 68, 109, 55, 33, 6, 2, 1];
  2.  
    var max = arr[ 0];
  3.  
    function findMax( i ){
  4.  
    if( i == arr.length ) return max;
  5.  
    if( max < arr[i] ) max = arr[i];
  6.  
    findMax(i+ 1);
  7.  
    }
  8.  
     
  9.  
    findMax( 1);
  10.  
    console.log( max);

使用 for 循環遍歷

  1.  
    var arr = [ 9, 8, 55, 66, 49, 68, 109, 55, 33, 6, 2, 1];
  2.  
    var max = arr[ 0];
  3.  
    for( var i = 1; i < arr.length; i++){
  4.  
    if( max < arr[i] ){
  5.  
    max = arr[i];
  6.  
    }
  7.  
    }
  8.  
     
  9.  
    console.log( max);

使用apply將數組傳入max方法中直接返回

Math.max.apply(null,[9,8,55,66,49,68,109,55,33,6,2,1])

除此以外,還有不少數組排序方式,均可以在排序後,根據新數組索引值獲取 最大/最小 值。

  1.  
    var a=[ 1, 2, 3, 5];
  2.  
    console.log( Math.max.apply( null, a)); //最大值
  3.  
    console.log( Math.min.apply( null, a)); //最小值

多維數組能夠這麼修改:

  1.  
    var a=[ 1, 2, 3,[ 5, 6],[ 1, 4, 8]];
  2.  
    var ta=a.join( ",").split( ","); //轉化爲一維數組
  3.  
    console.log( Math.max.apply( null,ta)); //最大值
  4.  
    console.log( Math.min.apply( null,ta)); //最小值
相關文章
相關標籤/搜索