跳至主要內容

Flood Fill 解題經驗談

第一次接觸到 Flood Fill 這個演算法題型時,我連題目都看不太懂,後來經過一些搜尋及研究才了解,Flood Fill 如名所義,就是洪水淹蓋的意思。

你用過小畫家的一個油漆桶的功能嗎?這個功能就是讓相連同顏色的所有區域變成油漆桶要指定的區域,而這就是 Flood Fill。

了解完題目後,就要來解題,才發現,真的不簡單。

以程式碼解釋題型

用程式碼來顯示題型,就會像是一個 2X2 的 array 所形成的 2D 平面圖,而每一個座標上會標示一個整數,舉例來說長得像這個。
111
010
012
而這個 2D 圖就是代表這個 array, [[1,1,1],[0,1,0],[0,1,2]]。假設我們起始的位置是[1,1],也就是正中間的這個數字,我們要讓所有連接數字一樣的全部換成另外一個數字,假設是 2 好了,會變成。
222
020
022

簡單化題型

在寫任何程式碼以前,光是想出解題的邏輯就相當困難。
  • 要每一個座標一個個檢查嗎?可能會太耗時。
  • 要先檢查上下,再左右嗎?可能會有許多地方顏色改不掉。
  • 要繞圈圈檢查嗎?那可能無法檢查是否跟上一個連接座標是否同數字。
所以,我暫時解不開,我只想到一個方案,就是先解解看 1D 的 Flood Fill。

1D 的 Flood Fill

所謂的 1D Flood FIll 就是原本的 2D 變成 1D。這樣,題目就變得簡單多了。假設這個 array [1,0,1,1,1,0,0,1],的第4個數字連接的全都要變成 2 ,就會變成 [1,0,2,2,2,0,0,1]。

我想到的解題方法就是,先往右檢查到底,直到沒有同數字的再回到原點,向左檢查。

範例

回到 2D

1D 版本的 Flood Fill 解完後,我來嘗試原本的版本。
我到參考邏輯跟解 1D 的版本一致,就是先又在作,然後在向上向下移動,但是,這樣的話會有很多需要轉彎的地方數字改變不到,按下方按鈕看結果。

最後

最後我想到最土法煉鋼的方式,就是從原點出發,然後依上、右、下、左順序,依序檢查是否有與上原點連接相同數字,然後記錄起來,在重紀錄起來的座標中重複檢查上、右、下、左方向的連接座標,然而這個解法 leetcode 無法接受,因為花太多時間。

留言

此網誌的熱門文章

What這個字怎麼念?

我在美國念大學的時候,有一次我說了這個字what,結果大家都笑了,並且之後有人為了揶揄我,還學我說what的方式。 我在台灣英文學到高中,大學學測英文滿級分,托福也考過了,卻連what一個字都念不好。 經過研究,多數美國人what是念whut,也就是嘴巴不用張大,輕輕的帶過搭u這個音。 這邊的u音是想說的but或是up裡面的u,輕輕短短的。 What不要念成whaaat,這邊的a不是"阿",嘴巴張大大的哦。是u像是but。

英文逐步口譯筆記經驗談

這篇文章是我自己在擔任口譯時做筆記的經驗。 逐步口譯筆記重要性 很重要,長逐步口譯,當講者語畢,實際上只能看著筆記要點翻譯,根本不可能回想,講者剛剛說了甚麼,如果筆記沒記到,很有可能會漏翻。 大量符號 長逐步口譯筆記主要使用自己習慣的符號,或是上場前準備時,就先預設一些符號。 轉折語氣別忘記 有時候講者在表述一個論點時,會先以反向論點開始說,然後才轉折語氣,進入重點。我自己是用 but 代表「但是」、「可是」、「然而」。 並列詞 美國人常常用並列詞,也就是列出許多例子來印證一件事。我筆記方式是用一個直線。 像是這個例子,我很喜歡動物,像是貓、狗、鳥類都喜歡。 數字筆記訣竅 聽到當下要用要翻成的語言做筆記,例如 130 thousand,直接記13W。 常用記號

Cors 基礎設定

建立一個 API 伺服器要設定 Access-Control-Allow-Origin,這樣別的網站才能呼叫, Koa  如果適用 Koa,只要做一個 mideleware 設定即可。 app.use(async (ctx, next) => { ctx.set('Access-Control-Allow-Origin', '*'); await next(); }); Express app.use(async (ctx, next) => { res.set('Access-Control-Allow-Origin', '*') }); 如果只允許一個網域呼叫 將 * 換成該網域即可。 如果允許多個網域呼叫 使用 Swich 的方式,先讀取前端傳來得 headers.origin 來決定設定的 access 即可。3 其他設定 另外,還有 Access-Control-Allow-Methods 跟  Access-Control-Allow-Headers 可以設定,舉例來說,最近我做了一個 Koa.js 應用程式,就要設定 Access-Control-Allow-Headers 包括 content-type 才能傳送 post 請求。