LeetCode | 0994. Rotting Oranges腐爛的橘子【Python】

LeetCode 0994. Rotting Oranges腐爛的橘子【Easy】【Python】【BFS】

Problem

LeetCode

In a given grid, each cell can have one of three values:

  • the value 0 representing an empty cell;
  • the value 1 representing a fresh orange;
  • the value 2 representing a rotten orange.

Every minute, any fresh orange that is adjacent (4-directionally) to a rotten orange becomes rotten.

Return the minimum number of minutes that must elapse until no cell has a fresh orange. If this is impossible, return -1 instead.

Example 1:

image
Input: [[2,1,1],[1,1,0],[0,1,1]]
Output: 4

Example 2:

Input: [[2,1,1],[0,1,1],[1,0,1]]
Output: -1
Explanation:  The orange in the bottom left corner (row 2, column 0) is never rotten, because rotting only happens 4-directionally.

Example 3:

Input: [[0,2]]
Output: 0
Explanation:  Since there are already no fresh oranges at minute 0, the answer is just 0.

Note:

  1. 1 <= grid.length <= 10
  2. 1 <= grid[0].length <= 10
  3. grid[i][j] is only 0, 1, or 2.

問題

力扣

在給定的網(wǎng)格中风瘦,每個單元格可以有以下三個值之一:

  • 0 代表空單元格习绢;
  • 1 代表新鮮橘子叛复;
  • 2 代表腐爛的橘子谒获。

每分鐘,任何與腐爛的橘子(在 4 個正方向上)相鄰的新鮮橘子都會腐爛钟病。

返回直到單元格中沒有新鮮橘子為止所必須經(jīng)過的最小分鐘數(shù)挫剑。如果不可能或悲,返回 -1

示例 1:

image
輸入:[[2,1,1],[1,1,0],[0,1,1]]
輸出:4

示例 2:

輸入:[[2,1,1],[0,1,1],[1,0,1]]
輸出:-1
解釋:左下角的橘子(第 2 行怪与, 第 0 列)永遠不會腐爛夺刑,因為腐爛只會發(fā)生在 4 個正向上。

示例 3:

輸入:[[0,2]]
輸出:0
解釋:因為 0 分鐘時已經(jīng)沒有新鮮橘子了分别,所以答案就是 0 遍愿。

提示:

  1. 1 <= grid.length <= 10
  2. 1 <= grid[0].length <= 10
  3. grid[i][j] 僅為 0, 1, 或 2

思路

BFS

先統(tǒng)計新鮮橘子個數(shù) fresh,并把腐爛橘子個數(shù)放在隊列 q 中耘斩。
遍歷 q沼填,每次彈出隊首元素,判斷四周有沒有新鮮橘子括授,并變?yōu)楦癄€坞笙,同時加入隊列 q,fresh 減 1荚虚。
當(dāng) q 為空時表示已經(jīng)全部腐爛薛夜。
每次遍歷都要判斷是否還有新鮮橘子剩余,如果沒有新鮮橘子剩余版述,直接返回 minute梯澜。
最后結(jié)束遍歷,還要單獨判斷是否有新鮮橘子剩余(防止出現(xiàn)類似示例 2 這種永遠不會腐爛的橘子的情況)渴析。

時間復(fù)雜度: O(n*m)晚伙,n 為行數(shù),m 為列數(shù)俭茧。
空間復(fù)雜度: O(n*m)咆疗,n 為行數(shù),m 為列數(shù)恢恼。

Python3代碼
class Solution:
    def orangesRotting(self, grid: List[List[int]]) -> int:
        n, m = len(grid), len(grid[0])
        fresh = 0
        q = []

        # count fresh oranges and enqueue rotten oranges
        for i in range(n):
            for j in range(m):
                if grid[i][j] == 1:
                    fresh += 1
                elif grid[i][j] == 2:
                    q.append((i, j))
        
        if fresh == 0:
            return 0
        dirs = [(0, 1), (0, -1), (-1, 0), (1, 0)]
        minute = 0
        
        # bfs
        while q:
            if fresh == 0:
                return minute
                
            size = len(q)
            for i in range(size):
                x, y = q.pop(0)
                for d in dirs:
                    nx, ny = x + d[0], y + d[1]
                    if nx < 0 or nx >= n or ny < 0 or ny >= m or grid[nx][ny] != 1:
                        continue
                    grid[nx][ny] = 2
                    q.append((nx, ny))
                    fresh -= 1
            minute += 1

        if fresh != 0:
            return -1

代碼地址

GitHub鏈接

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市胰默,隨后出現(xiàn)的幾起案子场斑,更是在濱河造成了極大的恐慌漓踢,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件漏隐,死亡現(xiàn)場離奇詭異喧半,居然都是意外死亡,警方通過查閱死者的電腦和手機青责,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門挺据,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人脖隶,你說我怎么就攤上這事。” “怎么了个唧?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵攘乒,是天一觀的道長。 經(jīng)常有香客問我构蹬,道長王暗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任庄敛,我火速辦了婚禮俗壹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘藻烤。我一直安慰自己绷雏,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布隐绵。 她就那樣靜靜地躺著之众,像睡著了一般。 火紅的嫁衣襯著肌膚如雪依许。 梳的紋絲不亂的頭發(fā)上棺禾,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天,我揣著相機與錄音峭跳,去河邊找鬼膘婶。 笑死,一個胖子當(dāng)著我的面吹牛蛀醉,可吹牛的內(nèi)容都是我干的悬襟。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼拯刁,長吁一口氣:“原來是場噩夢啊……” “哼脊岳!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤割捅,失蹤者是張志新(化名)和其女友劉穎奶躯,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體亿驾,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡嘹黔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了莫瞬。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片儡蔓。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖疼邀,靈堂內(nèi)的尸體忽然破棺而出喂江,到底是詐尸還是另有隱情,我是刑警寧澤檩小,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布开呐,位于F島的核電站,受9級特大地震影響规求,放射性物質(zhì)發(fā)生泄漏筐付。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一阻肿、第九天 我趴在偏房一處隱蔽的房頂上張望瓦戚。 院中可真熱鬧,春花似錦丛塌、人聲如沸较解。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽印衔。三九已至,卻和暖如春姥敛,著一層夾襖步出監(jiān)牢的瞬間奸焙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工彤敛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留与帆,地道東北人。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓墨榄,卻偏偏與公主長得像玄糟,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子袄秩,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容