【力扣】419:甲板上的戰艦 |BFS

題目描述

給定一個二維的甲板, 請計算其中有多少艘戰艦。 戰艦用 'X’表示,空位用 '.'表示。 你需要遵守以下規則:

給你一個有效的甲板,僅由戰艦或者空位組成。
戰艦隻能水平或者垂直放置。換句話說,戰艦隻能由 1xN (1 行, N 列)組成,或者 Nx1 (N 行, 1 列)組成,其中N可以是任意大小。
兩艘戰艦之間至少有一個水平或垂直的空位分隔 - 即沒有相鄰的戰艦。

進階:你可以用一次掃描算法,只使用O(1)額外空間,並且不修改甲板的值來解決這個問題嗎?

來源:力扣(LeetCode)

算法思路

標準版 青春版

算是廣度優先搜索吧,只是因爲是戰艦,直的,所以不許用擴散搜索,而是朝一個方向搜索。
所以是標準BFS的修改版本。

class Solution:
    def countBattleships(self, board) -> int:
        m,n=len(board),len(board[0])
        res=0
        for x in range(m):
            for y in range(n):
                if board[x][y]=='X':
                    res+=1
                    board[x][y]='.'
                    i,j=x,y
                    if i+1<m and board[i+1][j]=='X':
                        while i+1<m and board[i+1][j]=='X':
                            board[i+1][j]='.'
                            i+=1
                    elif j+1<n and board[i][j+1]=='X':
                        while j+1<n and board[i][j+1]=='X':
                            board[i][j+1]='.'
                            j+=1
        return res

進階 PLUS

一次搞定,常數額外空間,還不可以修改甲板,我是沒想到

但是看了一眼評論我傻了……
每遍歷到一個X判斷其上方或左方是不是X,如果不是就表示這是一個新戰艦。

我現在在懷疑自己是**。

class Solution:
    def countBattleships(self, board) -> int:
        m,n=len(board),len(board[0])
        res=0
        for x in range(m):
            for y in range(n):
                if board[x][y]=='X':
                    if x-1>=0 and board[x-1][y]=='X':
                        continue
                    if y-1>=0 and board[x][y-1]=='X':
                        continue
                    res+=1
        return res

執行用時 :84 ms, 在所有 Python3 提交中擊敗了77.47%的用戶
內存消耗 :14.2 MB, 在所有 Python3 提交中擊敗了100.00%的用戶

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章