2次元配列でのルックアップ
タイトル説明
二次元アレイ(各一次元アレイは、同じ長さを有している)において、各行がでソートされた増加順に左から右へ、各列がでソートされた増大順に上から下へ。関数を完成させ、そのような2次元配列と整数を入力して、配列に整数が含まれているかどうかを判別してください。
解決策1:暴力
function Find(target, array)
{
if(array.length == 0 || target == null) return false;
for(let i = 0; i < array.length; i++){
for(let j = 0; j < array[0].length ; j++){
if(array[i][j] == target) return true;
}
}
return false;
}
時間計算量:O(N 2)
スペースの複雑さ:O(1)
解決策2:
タイトルの要件に応じて、各行は左から右に昇順で並べ替えられ、各列は上から下に昇順で並べ替えられます。この機能を使用して、データに基づいて検索できます。
- 右端の列の上から下に、ターゲット以上の番号を見つけてから、右から左に検索します。ターゲットはこの行にあるか、見つかりません。
function Find(target, array)
{
if(array.length == 0 || target == null) return false;
let i = 0,
j = array[0].length - 1;
while(i < array.length && j >= 0){
if(array[i][j] == target) return true;
if(array[i][j] > target) j--;
else i++;
}
return false;
}
時間計算量:O(M + N)(行の高さ+列の高さ)
スペースの複雑さ:O(1)
その他の解決策
2番目のソリューションと同じアイデアで、特定のコーナーから開始し、一致する行が見つかるまで比較ごとに1行を削除してから、その行を検索します。