2017-11-15 23 views
2

Math.minを使用して、数字の配列から最小の数字を取得しています。しかし、私はまた、2番目に小さい番号を取得する必要があります。 Math.minを使ってこれを行う方法があるかどうか疑問に思ってください。そうでない場合は、この番号を取得する最良の方法を探してください。ここでMath.minを使用して配列から2番目に小さい番号を取得できますか?

は、私が持っているものです。

var arr = [15, 37, 9, 21, 55]; 
 
var min = Math.min.apply(null, arr.filter(Boolean)); 
 
var secondMin; // Get second smallest number from array here 
 

 
console.log('Smallest number: ' + min); 
 
console.log('Second smallest number: ' + secondMin);

+1

言語タグを追加します。これは実際に数学の問題ではありません。 –

+0

いいえリンクされたリストを持たず、見つかった分を削除することができない限り、方法はありません。正しい解決策は、アレイを分割することです(minのようなO(n)演算)。 –

+2

'arr.sort((a、b)=> a - b); var min = arr [0]; var secondMin = arr [1]; ' – IrkenInvader

答えて

3

私はあなたの最初の分にArray.filter(なぜですか?)を使用しています参照してください。したがって、ES6の機能を使用している場合は、最初に配列からminを削除することで、2番目に低い値を見つけることができます。

var secondMin = Math.min.apply(null, arr.filter(n => n != min)); 

編集:明確にするため、最初の分を計算しながら、あなたはArray.filter(Boolean)と非常に巧妙な何かをやっていない限り、あなただけのフィルタリングなしで配列を渡す必要があります。

var min = Math.min.apply(null, arr); 
+0

これはあまりエレガントではありませんが、ソートよりもパフォーマンスが優れています。 –

2

パフォーマンスを心配していない場合は、単純に配列を並べ替えることができます。

arr.sort(function(a, b) { 
    return a - b; 
}); 
+1

@MadPhysicist彼は単に「最高」と述べました。読みやすさに関してはそうだと思います。私も明示的に "あなたがパフォーマンスを心配していない"と述べました。私もそれを大胆にする必要がありますか? –

+0

私はそれを全然読んでいません。 "not"をスキップしました。 –

+0

私はnumpyのパーティション関数に相当するJavaScriptを見つけることができなかったので、これは得られるほどエレガントです。 –

2

ちょうどそれを作るためにスレッドが完了しました:最も速い方法は、最小限を見つけるために行うことができるように、すべての要素を反復することです。しかし、あなたのニーズに応じて、最初の最小値(候補)と2番目の最小値が使用されます。

このロジックはO(N)ですが、ソート方法はO(N lg(N))です。

しかし、これが練習用であるかどうかは気にしないでください。

反復を独立した値として処理する場合(ちょうど.sort(...)[1]の場合と同じように)、<の代わりに<=を使用する必要があります。

var arr = [15, 37, 9, 21, 55]; 
 
var min = Infinity, secondMin = Infinity; 
 
for (var i= 0; i< arr.length; i++) { 
 
    if (arr[i]< min) { 
 
     secondMin = min; 
 
     min = arr[i]; 
 
    } else if (arr[i]< secondMin) { 
 
     secondMin = arr[i]; 
 
    } 
 
} 
 

 
console.log('Smallest number: ' + min); 
 
console.log('Second smallest number: ' + secondMin);

+0

リピートでは機能しません。実際には、配列を分割する必要があります。私はこのように書く関数にカウンタの入力を与えます。 –

+0

パーティショニングはO(n)と同様です。 –

+0

@MadPhysicist、コードスニペットを追加しました。たぶん私は根本的な質問を誤解していました。著者は '[15,37,9,21,55]'のために15を得たいと思っていませんか? – skyboyer

2

@skyboyerは、おそらく2つの最小の要素を見つけるための最速のアルゴリズムであるものを提供します。 O(n)時に実行されるもう1つの型のアルゴリズムは、(一般的なcomp-sci定義では、JavaScriptでは通常の方法ではありません)です。 k thよりもほとんどのパーティション選択アルゴリズム(quickselectFloyd-Rivestintroselect)はO(n)時間で実行されますにもかかわらず

、skyboyerの答えがあるため、あなたが探しているパーティションの特定の性質を速くなります@、およびすべてのこれらのアルゴリズムは重いが付属していますので、一定係数。

ありフロイド・リベストを実装するJavaScriptライブラリですが、代わりにあなたのためのパーティショニングを行うことができますquickselectの名前:arr[0]が最小になるように

quickselect(arr, 1) 

arrが再配置され、arr[1]が第二であります最小の要素であり、残りの要素は任意の順序です。

0

ES6(非常にパフォーマンスの)削減とソリューション

const A = [8, 24, 3, 20, 1, 17] 
 
const min = Math.min(...A) 
 
const secondMin = A.reduce((pre, cur) => (cur < pre && cur !== min) ? cur : pre 
 
    , Infinity) 
 
console.log(min, secondMin)

関連する問題