iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 21
0
自我挑戰組

LeetCode演算法刷題 使用Go系列 第 21

Day21-[LeetCode演算法刷題 使用Go] -Island Perimeter

  • 分享至 

  • xImage
  •  

題目連結: Island Perimeter

題目描述為: 用一個二維陣列來表示一張地圖,其中陣列內元素值為 1 表示土地,元素值為 0 表示水,那些連在一起的土地形成了一座島嶼,而整張地圖只有一個島嶼,要我們找出島嶼的周長。

思路 1: 遍歷法

我們可以按照定義遍歷所有格子點,檢查與其相鄰的4個邊是否碰到邊界或者碰到水域,若有則周長+1,每個格子點周長至多加4。

  • 複雜度評估
    設給定二維陣列的格子點數量為 N。我們需要全部遍歷一次,時間複雜度為 O(N)。此方法只用了常數個變數,與 N 無關,空間複雜度為 O(1)。

參考程式碼

func islandPerimeter(grid [][]int) int {
    Ans := 0
	lx := len(grid)
	ly := len(grid[0])

	for i := 0; i < lx; i++ {
		for j := 0; j < ly; j++ {

			// in water region
			if grid[i][j] == 0 {
				continue
			}

			//up
			if j-1 < 0 || grid[i][j-1] == 0 {
				Ans++
			}

			//down
			if j+1 >= ly || grid[i][j+1] == 0 {
				Ans++
			}

			//left
			if i-1 < 0 || grid[i-1][j] == 0 {
				Ans++
			}

			//right
			if i+1 >= lx || grid[i+1][j] == 0 {
				Ans++
			}

		}
	}

	return Ans
}

小結:

方法 1 遍歷全部格子點,此方法當島嶼數量不為 1 時以及計算島嶼面積時,仍然適用。若要求島嶼數量時,則需增加變數來紀錄各格子點為土地時,所在的島嶼編號。
我將解法加上簡單的測試,上傳程式碼到此。

補充:

數學上對於研究周長問題的過程中也發展了許多重要的思想與方法,我舉其中幾例:

  1. 給定長度的簡單封閉曲線,所圍成的圖形中面積最大者為圓,此即為著名的等周定理
  2. 設圓半徑為 r,其周長為 πr² 極易求。然而橢圓周長目前尚未有精確的公式解,只有積分表達形式。

上一篇
Day20-[LeetCode演算法刷題 使用Go] -Invert Binary Tree
下一篇
Day22-[LeetCode演算法刷題 使用Go] -Find Winner on a Tic Tac Toe Game
系列文
LeetCode演算法刷題 使用Go30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言