JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

JavaScriptで増加するトリプレットが存在するか判定する方法

増加数列とは

各要素が直前の要素以上の値を持つ数列のことを「増加数列」と呼びます。

例えば、次のような数列が挙げられます。

4, 6, 8, 9, 11, 14 は増加数列です
3, 3, 3, 3, 3, 3, 3 も増加数列です

問題

数値の配列 arr を唯一の引数として受け取るJavaScript関数を作成する必要があります。この関数は、配列内に「増加する3つの要素(トリプレット)」が存在するかどうかを判定して返します。

例えば、関数への入力が次の場合 −

const arr = [4, 1, 5, 7, 3, 1, 4];

出力は次のようになります −

const output = true;

出力の説明

配列内に 1, 5, 7 という連続する増加要素が存在するため、結果は true となります。

この問題を解くコードは次のとおりです −

const arr = [4, 1, 5, 7, 3, 1, 4];
const increasingTriplet = function(arr) {
   let first = Infinity;
   let second = Infinity;
   for (let curr of arr) {
      if (curr > second && curr > first) {
         return true;
      };
      if (curr > first) {
         second = curr;
      }else{
         first = curr;
      };
   };
   return false;
};
console.log(increasingTriplet(arr));

コードの解説

このアルゴリズムでは、貪欲法(グリーディー法)を用いて配列を一度だけ走査します。変数 first には「最も小さい候補値」を、変数 second には「first より大きい2番目の候補値」をそれぞれ保持します。

ループの各反復で確認する条件は次のとおりです −

現在の要素が second よりも大きければ、first < second < 現在の要素 という増加トリプレットが成立していることになるため true を返します。そうでなければ、現在の値を first または second のいずれか適切な方に更新していきます。

つまり、0 ≤ i < j < k ≤ n-1 を満たす i, j, k が存在し、arr[i] < arr[j] < arr[k] となる場合は true を返し、最後まで見つからなければ false を返します。

この手法の計算量は時間 O(n)、空間 O(1) であり、非常に効率的です。

出力

コンソールへの出力は次のとおりです −

true

  1. JavaScriptで配列の要素が2乗の関係かどうかをチェックする方法

    問題 2つの数値の配列 arr1 と arr2 をそれぞれ第1・第2引数として受け取るJavaScript関数を作成することを考えます。 この関数は、arr2 のすべての要素が、出現順序に関係なく arr1 のいずれかの要素の2乗と一致する場合にのみ true を返し、それ以外の場合は false を返す必要があります。 たとえば、関数への入力が次のようであった場合を考えてみましょう。 入力 const arr1 = [4, 1, 8, 5, 9]; const arr2 = [81, 1, 25, 16, 64]; 出力 const output = true; この場合、81 = 9²、

  2. JavaScriptで行列の対角線がすべて同じ要素かどうかを判定する方法

    問題概要 リテラルを要素とする2次元配列 arr を第一引数(唯一の引数)として受け取るJavaScript関数を作成します。 この関数の役割は、行列の左上から右下へ向かうすべての対角線が同じ要素で構成されているかどうかを判定することです。これは、いわゆる「トゥーマトリックス(Toeplitz行列)」と呼ばれる行列の判定問題に相当します。 条件を満たしていれば true を、そうでなければ false を返します。 例として、次の入力を関数に渡した場合を考えてみましょう。 入力 const arr = [ [6, 7, 8, 9], [2, 6, 7, 8], [1,