情境模擬題 隔板的放置方法數 Ways to Divide a Long Corridor_Leetcode #2147

閱讀時間約 5 分鐘

題目敘述

題目會給我們一個corridor陣列,裡面代表盆栽和座位的分布,P代表Plant盆栽,S代表Seat座位。要求我們依照佈置規則放置隔板,計算總共有幾個合法的隔板分割方法數?

規則:

每兩個座位視為一組,每兩組之間的盆栽所產生的空位,皆可放置一片隔板

每一組分割內必須恰好包含兩個座位,不多也不少。


最後回傳答案之前,記得對109 + 7做除法取餘數。

詳細的題目可在這裡看到


測試範例

Example 1:

raw-image
Input: corridor = "SSPPSPS"
Output: 3
Explanation: There are 3 different ways to divide the corridor.
The black bars in the above image indicate the two room dividers already installed.
Note that in each of the ways, each section has exactly two seats.

Example 2:

raw-image
Input: corridor = "PPSPSP"
Output: 1
Explanation: There is only 1 way to divide the corridor, by not installing any additional dividers.
Installing any would create some section that does not have exactly two seats.

Example 3:

raw-image
Input: corridor = "S"
Output: 0
Explanation: There is no way to divide the corridor because there will always be a section that does not have exactly two seats.

約束條件

Constraints:

  • n == corridor.length
  • 1 <= n <= 10^5
  • corridor[i] is either 'S' or 'P'.

演算法

Seat Seat Plant ... Plant Seat Seat
^ ^ ^ ^

^ : 合法的隔板位置,也是合法的分割位置

依照規則進行模擬每一組內一定恰好包含兩個座位

每一組座位之間的盆栽所產生的空位,皆是合法的分割位置

舉例來說,如果輸入是SSPPPSS,

那麼中間的空格數 = 5 - 1 = 4

= 3個盆栽所產生的空位 = 合法的分割位置總數

= 合法的分割數目


最後,依照排列組合的乘法原理,把每一組座位之間分割方法數相乘

再對109 + 7做除法取餘數,就是最終答案。


程式碼

class Solution:
 def numberOfWays(self, corridor: str) -> int:
  
  # total seat count
  seatCount = 0

  # lastest seat seen before on the left hand side
  lastSeen = -1

  # valid partition
  split = 1

  for i, seat in enumerate(corridor):

   if seat == 'P':
    continue

   seatCount += 1

   # Try to divide on every two seats
   if seatCount >= 2 and seatCount % 2 == 1:
    split *= (i - lastSeen )
    split %= (10**9 + 7)
   
   # update last seen position of seat
   lastSeen = i
  
  if seatCount >= 2 and seatCount % 2 == 0:
   # Valid partition exists only when there are even number of seats
   return split
  
  return 0

複雜度分析

時間複雜度:

O( n ) 依次從左到右的線性掃描,長度為O(n) 和原本的輸入陣列一樣長。

空間複雜度:

O( 1 ) 使用到的是固定大小的臨時變數,尺寸皆為O(1)。


關鍵知識點

關鍵在於經過範例、規則找出規律,任意兩組之間的盆栽空位皆是合法的分割位置

最後,依照題意,依據乘法原理相乘,即可得所有合法分割的方法數。


Reference:

[1] Python O(n) by greedy partition [w/ Comment] - Number of Ways to Divide a Long Corridor - LeetCode

avatar-img
88會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
題目敘述 題目會給定一組數字鍵盤,要求我們每次撥號的時候都走象棋的"馬"步,也就是日字型的走法,請問給定長度的n的數字撥號方式有幾種? 最後回傳答案之前,記得對109 + 7做除法取餘數。 詳細的題目可在這裡看到 數字鍵盤的配置如下圖 象棋的"馬"步 日字型走法 示意圖
題目會給我們一個陣列nums,要求我們以每個陣列元素分別當作軸心點,計算差值的絕對值總和,最後以陣列的形式,返回答案。 測試範例 Example 1: Input: nums = [2,3,5] Output: [4,3,5]
題目敘述 題目會給我們一個不規則排列的二維陣列,要求我們列出從起點出發,走次對角線,由左下到右上逐層拜訪的路徑。
題目敘述 題目會給我們一個陣列,要求我們返回 兩數之和=target所在的陣列索引值。 題目還額外保證,一定剛好有一組解。 測試範例 Example 1: Input: nums = [2,7,11,15], target = 9 Output: [0,1]
這題的題目在這裡:Find Pivot Index 題目敘述 題目會給我們一個整數陣列nums,要求我們計算平衡軸心點在哪? 平衡軸心的意思就是軸心點索引左側的元素總合 = 軸心點索引右側的元素總合
題目會給我們一個方陣,要求我們計算兩條對角線的元素總和。
題目敘述 題目會給定一組數字鍵盤,要求我們每次撥號的時候都走象棋的"馬"步,也就是日字型的走法,請問給定長度的n的數字撥號方式有幾種? 最後回傳答案之前,記得對109 + 7做除法取餘數。 詳細的題目可在這裡看到 數字鍵盤的配置如下圖 象棋的"馬"步 日字型走法 示意圖
題目會給我們一個陣列nums,要求我們以每個陣列元素分別當作軸心點,計算差值的絕對值總和,最後以陣列的形式,返回答案。 測試範例 Example 1: Input: nums = [2,3,5] Output: [4,3,5]
題目敘述 題目會給我們一個不規則排列的二維陣列,要求我們列出從起點出發,走次對角線,由左下到右上逐層拜訪的路徑。
題目敘述 題目會給我們一個陣列,要求我們返回 兩數之和=target所在的陣列索引值。 題目還額外保證,一定剛好有一組解。 測試範例 Example 1: Input: nums = [2,7,11,15], target = 9 Output: [0,1]
這題的題目在這裡:Find Pivot Index 題目敘述 題目會給我們一個整數陣列nums,要求我們計算平衡軸心點在哪? 平衡軸心的意思就是軸心點索引左側的元素總合 = 軸心點索引右側的元素總合
題目會給我們一個方陣,要求我們計算兩條對角線的元素總和。
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
閒聊 相較於前面2篇,鴻海&日月光,是在除權息後,出現大幅度回檔,進行抄底反彈。 20230705操作隨筆-與鴻海的恩怨情仇|方格子 vocus 20230705操作隨筆-與鴻海的恩怨情仇|方格子 vocus 這次是在車上,搭著除權息行情,進行一波操作,2波價差都有吃到,一起存股鞋子的網友,
Thumbnail
AI室內設計工具,大致上可以提供四大產業面向的功能:1.對零售實體店家而言,可以展現店家形象;2.電子商務方面給予模擬產品於各種空間內展示的功能,省去實品於攝影棚拍攝的步驟及成本;3.對於房產或房東來說,更便於優化房屋或建築物等內飾及外觀的塑造;4.室內設計師、建築師、景觀師、佈置師等專家⋯⋯
對自閉症者而言,根本無法連串「上課要坐好=我要坐好」的相關性。 這情況,該怎麼辦? 安坐訓練務必進行 這在入幼稚園前,就要進行了。 剛開始,就要以角落為主,讓自閉症者使初步認知。 在自閉症者經由小活動的進行,感到好玩而有動機,就開始走出小世界。 在進行撤掉桌椅時,以漸進式為主 基本上,
Thumbnail
Web 3- 所有權 ( Ownership)就是社群。每個 TA 都是實實在在參與社群的建構、打造社群共識的人。在 Web 3 世界裡的一個鏈上,可以是由多個不同 interest niche 社群所組成的,甚至每個社群之間有像小丑魚和海葵一樣不可分割、必須互利共生的關係存在。這一點是和 Web
Thumbnail
好消息是你又多了一條充滿紅利的虛擬溝通渠道,壞消息是沒有人能告訴你如何準確預估這裡的 ROAS 或合理化你的 ROI。It’s time to show your entrepreneurship! 在進入正題之前想 Murmur 一下當代資深行銷從業人員的苦痛與憂傷… 這個主題的文章會帶到:
小李剛從口譯訓練班畢業,他所合作的翻譯社告訴他有一個急的口譯case,小李二話不說就答應了,因為他實在想把握住每一個鍛鍊的機會。 不過翻譯社才把小李的履歷提交給客戶就被打了回票,因為小李沒有任何實戰的戰績,因此,機會就飛走了。 小李受此打擊,但不氣餒,為了累積經驗,他不久答應了一個朋友的請託,做了一
Thumbnail
前兩篇講了許多,但我人微言輕,憑藉什麼讓人買單?網路上不也很多人做過討論了,這裡所說的又有什麼不一樣?以下,我們就來用數字說話,基於不同程度的簡化與假設,逐步做說明。開始之前先說一句:無誠勿試。
Thumbnail
        酸痛之道博大精深,每天這樣治療,總感到還有不足之處。趁著居家辦公的機會,在休息時間時,一秒就可以來作伸展運動。一樣平躺後,把癢癢球放到背部,利用身體的重量來壓迫背部的肌肉,直接刺激酸痛點就是直球對決!         只要注意不要用力過猛,以免治療酸痛不成,反倒是造成
Thumbnail
回首歷史,你我都會認同,我們都不會是納粹的一員,不會成為盧安達大屠殺的加害者吧? 本文以試圖瞭解暴力、酷刑拷打或大屠殺的角度,讓讀者得知「去個人化」與「去人性化」如何嚴重影響我們對待他人的方式。
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
閒聊 相較於前面2篇,鴻海&日月光,是在除權息後,出現大幅度回檔,進行抄底反彈。 20230705操作隨筆-與鴻海的恩怨情仇|方格子 vocus 20230705操作隨筆-與鴻海的恩怨情仇|方格子 vocus 這次是在車上,搭著除權息行情,進行一波操作,2波價差都有吃到,一起存股鞋子的網友,
Thumbnail
AI室內設計工具,大致上可以提供四大產業面向的功能:1.對零售實體店家而言,可以展現店家形象;2.電子商務方面給予模擬產品於各種空間內展示的功能,省去實品於攝影棚拍攝的步驟及成本;3.對於房產或房東來說,更便於優化房屋或建築物等內飾及外觀的塑造;4.室內設計師、建築師、景觀師、佈置師等專家⋯⋯
對自閉症者而言,根本無法連串「上課要坐好=我要坐好」的相關性。 這情況,該怎麼辦? 安坐訓練務必進行 這在入幼稚園前,就要進行了。 剛開始,就要以角落為主,讓自閉症者使初步認知。 在自閉症者經由小活動的進行,感到好玩而有動機,就開始走出小世界。 在進行撤掉桌椅時,以漸進式為主 基本上,
Thumbnail
Web 3- 所有權 ( Ownership)就是社群。每個 TA 都是實實在在參與社群的建構、打造社群共識的人。在 Web 3 世界裡的一個鏈上,可以是由多個不同 interest niche 社群所組成的,甚至每個社群之間有像小丑魚和海葵一樣不可分割、必須互利共生的關係存在。這一點是和 Web
Thumbnail
好消息是你又多了一條充滿紅利的虛擬溝通渠道,壞消息是沒有人能告訴你如何準確預估這裡的 ROAS 或合理化你的 ROI。It’s time to show your entrepreneurship! 在進入正題之前想 Murmur 一下當代資深行銷從業人員的苦痛與憂傷… 這個主題的文章會帶到:
小李剛從口譯訓練班畢業,他所合作的翻譯社告訴他有一個急的口譯case,小李二話不說就答應了,因為他實在想把握住每一個鍛鍊的機會。 不過翻譯社才把小李的履歷提交給客戶就被打了回票,因為小李沒有任何實戰的戰績,因此,機會就飛走了。 小李受此打擊,但不氣餒,為了累積經驗,他不久答應了一個朋友的請託,做了一
Thumbnail
前兩篇講了許多,但我人微言輕,憑藉什麼讓人買單?網路上不也很多人做過討論了,這裡所說的又有什麼不一樣?以下,我們就來用數字說話,基於不同程度的簡化與假設,逐步做說明。開始之前先說一句:無誠勿試。
Thumbnail
        酸痛之道博大精深,每天這樣治療,總感到還有不足之處。趁著居家辦公的機會,在休息時間時,一秒就可以來作伸展運動。一樣平躺後,把癢癢球放到背部,利用身體的重量來壓迫背部的肌肉,直接刺激酸痛點就是直球對決!         只要注意不要用力過猛,以免治療酸痛不成,反倒是造成
Thumbnail
回首歷史,你我都會認同,我們都不會是納粹的一員,不會成為盧安達大屠殺的加害者吧? 本文以試圖瞭解暴力、酷刑拷打或大屠殺的角度,讓讀者得知「去個人化」與「去人性化」如何嚴重影響我們對待他人的方式。