Leikouブラッシングノート:733。画像レンダリング(幅優先、深さ優先、わかりやすいコード、完全なソリューションコードとコメント)

トピック:

733章:画像のレンダリング

2次元整数配列で表される画像があります。各整数は画像のピクセル値を表し、値は0〜65535です。

画像がレンダリングされるピクセル値(行、列)を表す座標(sr、sc)と新しい色値newColorを指定して、画像の色を変更できるようにします。

彩色作業を完了するために、初期座標から始めて、初期座標の4方向に初期座標と同じピクセル値で接続されたピクセルを記録し、次にこれらの4方向の条件を満たす4つのピクセルを記録します。および対応する4つの方向の初期座標と同じピクセル値を持つ接続されたピクセル...、プロセスを繰り返します。記録されたすべてのピクセルのカラー値を新しいカラー値に変更します。

最後に、カラーリング後にレンダリングされたイメージに戻ります。

例1:

入力:
image = [[1,1,1]、[1,1,0]、[1,0,1]]
sr = 1、sc = 1、newColor = 2
出力:[[2,2,2] 、[2,2,0]、[2,0,1]]
分析:
画像の中央(座標(sr、sc)=(1,1))、
パス上のすべての適格なピクセル色は2に変更されました。
右下隅のピクセルは、
上、下、左、右の4方向の始点に接続されているピクセルではないため、2に変更されないことに注意してください

注意:

画像と画像[0]の長さは[1、50]の範囲です。
指定された初期点は、0 <= sr <image.lengthおよび0 <= sc <image [0] .lengthを満たします。
image [i] [j]とnewColorで表される色の値は[0、65535]の範囲です。

問題解決のアイデア:

この質問では、特定の2次元配列内の指定された「カラーブロック」を別の色に染色する必要があります。「カラーブロック」の定義は次のとおりです。同じ色の直接または間接的に隣接する正方形によって形成される全体。

「カラーブロック」は、異なる色の正方形に囲まれた同じ色の島であることがわかります。カラーブロック内の任意の場所から開始し、幅優先探索または深さ優先探索を使用して島全体をトラバースします。

注:ターゲットの色が初期の色と同じである場合、元の配列を変更する必要はありません。

方法1:

幅優先探索

与えられた開始点から開始し、幅優先探索を実行します。正方形が検索されるたびに、最初の位置の正方形と同じ色である場合、正方形がキューに追加され、正方形の色が更新されて、キューに繰り返し入力されないようにします。

注:初期位置の色は変更されるため、後の更新操作のために初期位置の色を保存する必要があります。

複雑さの分析

時間計算量:O(n×m)。ここで、nとmは、それぞれ2次元配列の行と列の数です。最悪の場合、すべての正方形を一度トラバースする必要があります。

スペースの複雑さ:O(n×m)。ここで、nとmは、それぞれ2次元配列の行と列の数です。主にキューのオーバーヘッド。

問題解決のPythonコード:

class Solution:
    def floodFill(self, image: List[List[int]], sr: int, sc: int, newColor: int) -> List[List[int]]:
        currColor = image[sr][sc]
        if currColor == newColor:
            return image
        
        n, m = len(image), len(image[0])
        que = collections.deque([(sr, sc)])
        image[sr][sc] = newColor
        while que:
            x, y = que.popleft()
            for mx, my in [(x - 1, y), (x + 1, y), (x, y - 1), (x, y + 1)]:
                if 0 <= mx < n and 0 <= my < m and image[mx][my] == currColor:
                    que.append((mx, my))
                    image[mx][my] = newColor
        
        return image

方法2:

深さ優先探索

与えられた開始点から開始し、深さ優先探索を実行します。正方形が検索されるたびに、初期位置の正方形と同じ色の場合は、繰り返し検索されないように正方形の色が更新されます。同じでない場合は、バックトラックが実行されます。

注:初期位置の色は変更されるため、後の更新操作のために初期位置の色を保存する必要があります。

複雑さの分析

時間計算量:O(n \ times m)O(n×m)。ここで、nnとmmは、それぞれ2次元配列の行と列の数です。最悪の場合、すべての正方形を一度トラバースする必要があります。

スペースの複雑さ:O(n \ times m)O(n×m)。ここで、nnとmmは、それぞれ2次元配列の行と列の数です。主にスタックスペースのオーバーヘッド。

問題解決のPythonコード:

class Solution:
    def floodFill(self, image: List[List[int]], sr: int, sc: int, newColor: int) -> List[List[int]]:
        n, m = len(image), len(image[0])
        currColor = image[sr][sc]

        def dfs(x: int, y: int):
            if image[x][y] == currColor:
                image[x][y] = newColor
                for mx, my in [(x - 1, y), (x + 1, y), (x, y - 1), (x, y + 1)]:
                    if 0 <= mx < n and 0 <= my < m and image[mx][my] == currColor:
                        dfs(mx, my)

        if currColor != newColor:
            dfs(sr, sc)
        return image

著者:LeetCode-ソリューション
リンク:https://leetcode-cn.com/problems/flood-fill/solution/tu-xiang-xuan-ran-by-leetcode-solution/
ソース:滞在ボタン(LeetCode)HTTPS:// leetcode-cn.com/problems/flood-fill/

おすすめ

転載: blog.csdn.net/weixin_44414948/article/details/113743925