2016-06-12 35 views
2

我有一個例子數組:查找多個最大值的指標在陣列

var arr = [10, 67, 100, 100];

我想找到數組中的最大值的指標。

此功能只找到一個指數:

function max(arr) { 
     var max = arr[0]; 
     var maxIndex = 0; 
     for (var i = 1; i < arr.length; i++) { 
      if (arr[i] > max) { 
       maxIndex = i; 
       max = arr[i]; 
      } 
     } 
     return maxIndex; 
} 

如何修改它返回最大指標陣列?在上面的示例數組中,應該返回

[2, 3]

回答

2

而不是隻跟蹤一個索引,你需要跟蹤所有的指標。這給一試:

function max(arr) { 
    var max = -Infinity; 
    var maxIndices = []; 
    for (var i = 0; i < arr.length; i++) { 
     if (arr[i] === max) { 
      maxIndices.push(i); 
     } else if (arr[i] > max) { 
      maxIndices = [i]; 
      max = arr[i]; 
     } 
    } 
    return maxIndices; 
} 
+1

'arr'可能是空的。我會初始化'max = -Infinity; maxIndices = [];我= 0「。 – Oriol

+0

感謝@Oriol,編輯了您的建議。 – smarx

1

function max(arr) { 
 
    var largest = Math.max.apply(Math, arr); 
 

 
    var indexes = [], i = -1; 
 
    while ((i = arr.indexOf(largest, i+1)) != -1){ 
 
     indexes.push(i); 
 
    } 
 
    return indexes; 
 
} 
 

 
var arr = [10, 67, 100, 100]; 
 
console.log(max(arr));

0

JS的Reduce可以完成這個任務有所幫助。

// Finds maximum value across entire array 
 
var maxArrSingle = function(arr) { 
 
    return arr.reduce(
 
    function(acc,val){ 
 
     return Math.max(acc,val); 
 
    }, 
 
    -Infinity); 
 
} 
 

 
// Find indices where array is at max 
 
var maxArrIndexes = function(arr) { 
 
    var max = maxArrSingle(arr); 
 
    return arr.reduce(function(acc,val,idx) { 
 
    if (val >= max) acc.push(idx); 
 
    return acc; 
 
    },[]); 
 
} 
 

 
// demos 
 
var arr = [10, 67, 100, 100]; 
 
console.log(maxArrIndexes(arr)); 
 

 
var arr = [-10, -67, -100, -100, -4000, -9, -90, -90 ]; 
 
console.log(maxArrIndexes(arr)); 
 

 
var arr = []; 
 
console.log(maxArrIndexes(arr)); 
 

 
var arr = [0]; 
 
console.log(maxArrIndexes(arr)); 
 

 
var arr = [0,0]; 
 
console.log(maxArrIndexes(arr));

+0

爲輸入'[0]'或'[0,0]'返回'[]''替換'arr [0] || Number.MIN_VALUE'與例如'-Infinity'來使它工作。 –

+0

@le_m很好。我更新了代碼 – user01

0

基於this runtime comparison,我建議尋找最大指數通過對循環優化:

function max(arr) { 
 
    var max = -Infinity, indices = []; 
 
    for (var i = 0; i < arr.length; ++i) { 
 
    if (arr[i] < max) continue; 
 
    if (arr[i] > max) { 
 
     indices = []; 
 
     max = arr[i]; 
 
    } 
 
    indices.push(i); 
 
    } 
 
    return indices; 
 
} 
 

 
console.log(max([10, 67, 100, 100])); // [2, 3]

比較反對arr[i] < max首先是因爲有用它評估爲t rue大部分時間,從而使我們能夠跳到下一次迭代,只有1個數組訪問權限+平均比較。不同的兩種算法的

運行比較:

根據https://jsfiddle.net/jv1z29jm/2/ - 請隨時更新。

  • 鉻(48):

    max_indexOf x 15,381 ops/sec ±2.94% (87 runs sampled) 
    max_reduce x 2,909 ops/sec ±2.63% (86 runs sampled) 
    max_forloop x 119,964 ops/sec ±1.80% (87 runs sampled) 
    max_forloopOptimized x 165,581 ops/sec ±1.50% (87 runs sampled) 
    Fastest is max_forloopOptimized 
    
  • 火狐(46):

    max_indexOf x 56,456 ops/sec ±0.74% (67 runs sampled) 
    max_reduce x 74,959 ops/sec ±0.86% (65 runs sampled) 
    max_forloop x 73,223 ops/sec ±24.75% (58 runs sampled) 
    max_forloopOptimized x 84,567 ops/sec ±9.99% (61 runs sampled) 
    Fastest is max_forloopOptimized 
    
1

我會做這樣;

var arr = [10, 67, 100, 100], 
 
     m = Math.max(...arr), 
 
    maxes = arr.reduce((p,c,i,a) => c == m ? p.concat(i) : p,[]); 
 
console.log(maxes);