Re: [閒聊] 每日LeetCode

作者: pandix (麵包屌)   2023-11-28 12:22:07
※ 引述《Neuenmuller (蘇菲・諾伊恩謬拉)》之銘言:
: Code 2(參考了Leetcode上solution裡Lee大師的做法):
: class Solution {
: public:
: int numberOfWays(string corridor) {
: long output = 1, count = 0;
: for (int i = 0, j = 0; i < corridor.size(); i++) {
: if (corridor[i] == 'S') {
: count++;
: if (count > 2 && count % 2 == 1) {
: output *= (i - j);
: output %= 1'000'000'007;
: }
: j = i;
: }
: }
: if (!count || count % 2 != 0) return 0;
: return output;
: }
: };
: 用count % 2來數有幾組椅子,count不歸零
: 第一個是用這個來找一組椅子跟下一組椅子比較簡單
: 第二個是如果遇到沒有椅子或是只有奇數個椅子的edge case都可以用count解決
: 另外我原本解裡面的頭尾問題也不用解決
: 這就是大師跟我的差距 :(
lee 的另一個做法我也很喜歡 DP狀態轉移
a, b, c 分別代表目前圈到的區域有0, 1, 2個座位的情況下
方法數有多少
如果遇到座位
0 個座位的情況會變成 1 個座位
1 個座位的情況就變成 2 個座位
2 個座位等於這個區域要強制結束開始畫新區域 而新區域由新座位開始所以也是 1
所以遇到座位時 a, b, c = 0, a+c, b
遇到盆栽的情況就可以考慮要不要畫新區域了
0 或 1 個座位的情況不行 因為還沒圈到 2 個座位
2 個座位的情況就可以選擇要把盆栽圈到目前的區域 或是開始一個新區域
而這個新區域就只有一個盆栽 所以是 0 個座位
也就是 a, b, c = a+c, b, c
最後的話就是看那些合法的狀態 也就是目前的區域要有 2 個座位( 0 個不行)
所以直接回傳 c 就好
Python code:
class Solution:
def numberOfWays(self, corridor: str) -> int:
mod = 10**9+7
a, b, c = 1, 0, 0
for ch in corridor:
if ch == 'S':
a, b, c = 0, a+c, b
else:
a += c
return c % mod
作者: ZooseWu (N5)   2023-11-28 12:23:00
這個解法好優雅

Links booklink

Contact Us: admin [ a t ] ucptt.com