[質問バンクをスワイプ] SwordはOffer_プログラミングの質問を指し、2次元配列で検索します

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:

タイトルの要件に応じて、各行は左から右に昇順で並べ替えられ、各列は上から下に昇順で並べ替えられます。この機能を使用して、データに基づいて検索できます。

  • 右端の列の上から下に、ターゲット以上の番号を見つけてから、右から左に検索します。ターゲットはこの行にあるか、見つかりません。

[外部リンク画像の転送に失敗しました。ソースサイトにヒル防止リンクメカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします(img-5ge7BKZM-1578546695120)(file:/// C:\ Users \ Dell \ AppData \ Local \ Temp \ ksohtml2064 \ wps2.jpg)]

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行を削除してから、その行を検索します。

おすすめ

転載: blog.csdn.net/weixin_42339197/article/details/103905806