463. 島嶼的周長(zhǎng)(Python)

題目

難度:★★☆☆☆
類(lèi)型:矩陣

給定一個(gè)包含 0 和 1 的二維網(wǎng)格地圖,其中 1 表示陸地 0 表示水域。

網(wǎng)格中的格子水平和垂直方向相連(對(duì)角線(xiàn)方向不相連)。整個(gè)網(wǎng)格被水完全包圍,但其中恰好有一個(gè)島嶼(或者說(shuō)墩剖,一個(gè)或多個(gè)表示陸地的格子相連組成的島嶼)。

島嶼中沒(méi)有“湖”(“湖” 指水域在島嶼內(nèi)部且不和島嶼周?chē)乃噙B)酝豪。格子是邊長(zhǎng)為 1 的正方形涛碑。網(wǎng)格為長(zhǎng)方形,且寬度和高度均不超過(guò) 100 孵淘。計(jì)算這個(gè)島嶼的周長(zhǎng)蒲障。

示例

輸入:
[[0,1,0,0],
[1,1,1,0],
[0,1,0,0],
[1,1,0,0]]
輸出: 16

解釋: 它的周長(zhǎng)是下面圖片中的 16 個(gè)黃色的邊:

島嶼邊長(zhǎng)

解答

方案1:計(jì)數(shù)邊長(zhǎng)

島嶼的邊是陸地和海洋的分界面,島嶼的周長(zhǎng)不僅由島嶼的面積決定瘫证,也由每個(gè)島嶼單元(值為1揉阎,邊長(zhǎng)為1的島嶼)之間的相鄰關(guān)系決定,在遍歷到的過(guò)程中背捌,如果遇到一塊陸地毙籽,判斷該陸地單元的上下左右四個(gè)方向是否有海洋或邊界,如果有的話(huà)毡庆,則將最終邊長(zhǎng)加一坑赡。

class Solution:
    def islandPerimeter(self, grid):
        H, W = len(grid), len(grid[0])                      # 獲得區(qū)域的高和寬
        side_length = 0                                     # 邊長(zhǎng)統(tǒng)計(jì)

        for h in range(H):                                  # 逐行遍歷
            for w in range(W):                              # 逐列遍歷
                if grid[h][w]:                              # 如果遇到陸地

                    if h - 1 < 0 or grid[h - 1][w] == 0:    # 上邊是地圖邊界或海洋
                        side_length += 1                    # 邊長(zhǎng)+1

                    if h + 1 >= H or grid[h + 1][w] == 0:   # 下邊是地圖邊界或海洋
                        side_length += 1                    # 邊長(zhǎng)+1

                    if w - 1 < 0 or grid[h][w - 1] == 0:    # 左邊是地圖邊界或海洋
                        side_length += 1                    # 邊長(zhǎng)+1
                    
                    if w + 1 >= W or grid[h][w + 1] == 0:   # 右邊是地圖邊界或海洋
                        side_length += 1                    # 邊長(zhǎng)+1
                        
        return side_length                                  # 返回陸地邊長(zhǎng)

方案2:只考慮右下

我們也可以只考慮右下方向:

  1. 如果遇到島嶼單元,要將周長(zhǎng)+4么抗,默認(rèn)當(dāng)前島嶼單元是個(gè)孤島毅否;

  2. 要考慮島嶼單元之間的相鄰關(guān)系,如果遇到右側(cè)或者下方有島嶼單元與當(dāng)前單元相鄰蝇刀,要根據(jù)情況削減周長(zhǎng):
    (1)當(dāng)前島嶼單元只有右側(cè)或只有下方有島嶼單元螟加,則將邊長(zhǎng)-2;
    (2)當(dāng)前島嶼單元的右側(cè)和下方均有島嶼單元,說(shuō)明當(dāng)前島嶼單元是內(nèi)陸地區(qū)捆探,需要將周長(zhǎng)-4然爆;

因?yàn)楸苊庵貜?fù)計(jì)算,所以考慮右下兩側(cè)黍图。

class Solution:
    def islandPerimeter(self, grid):
        H, W = len(grid), len(grid[0])                  # 獲得區(qū)域的高和寬
        side_length = 0                                 # 邊長(zhǎng)統(tǒng)計(jì)

        for h in range(H):                              # 逐行遍歷
            for w in range(W):                          # 逐列遍歷
                if grid[h][w]:                          # 如果遇到陸地
                    side_length += 4                    # 邊長(zhǎng)+4
                    if h+1 < H and grid[h+1][w]:        # 如果下方有一塊陸地
                        side_length -= 2                # 邊長(zhǎng)-2
                    if w+1 < W and grid[h][w+1]:        # 如果右側(cè)有一塊陸地
                        side_length -= 2                # 邊長(zhǎng)-2

        return side_length                              # 返回陸地邊長(zhǎng)

如有疑問(wèn)或建議曾雕,歡迎評(píng)論區(qū)留言~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市雌隅,隨后出現(xiàn)的幾起案子翻默,更是在濱河造成了極大的恐慌缸沃,老刑警劉巖恰起,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異趾牧,居然都是意外死亡检盼,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)翘单,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)吨枉,“玉大人,你說(shuō)我怎么就攤上這事哄芜∶餐ぃ” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵认臊,是天一觀(guān)的道長(zhǎng)圃庭。 經(jīng)常有香客問(wèn)我,道長(zhǎng)失晴,這世上最難降的妖魔是什么剧腻? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮涂屁,結(jié)果婚禮上书在,老公的妹妹穿的比我還像新娘。我一直安慰自己拆又,他們只是感情好儒旬,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著帖族,像睡著了一般栈源。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上盟萨,一...
    開(kāi)封第一講書(shū)人閱讀 51,692評(píng)論 1 305
  • 那天凉翻,我揣著相機(jī)與錄音,去河邊找鬼捻激。 笑死制轰,一個(gè)胖子當(dāng)著我的面吹牛前计,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播垃杖,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼男杈,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了调俘?” 一聲冷哼從身側(cè)響起伶棒,我...
    開(kāi)封第一講書(shū)人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎彩库,沒(méi)想到半個(gè)月后肤无,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡骇钦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年宛渐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片眯搭。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡窥翩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鳞仙,到底是詐尸還是另有隱情寇蚊,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布棍好,位于F島的核電站仗岸,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏梳玫。R本人自食惡果不足惜爹梁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望提澎。 院中可真熱鬧姚垃,春花似錦、人聲如沸盼忌。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)谦纱。三九已至看成,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間跨嘉,已是汗流浹背川慌。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人梦重。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓兑燥,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親琴拧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子降瞳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355