題目連結:
題目意譯:
你被給定一個二元陣列 nums。
一個陣列中的子陣列如果包含恰好一個為數字 1 的元素,則該子陣列是「好的」。
回傳一個整數代表著將陣列 nums 分切成若干個好的子陣列之方法數。由於答案可能太大,先將其模 10 ^ 9 + 7 後再回傳。
一個子陣列為一陣列中一個連續(xù)的非空元素序列。
限制:
1 ≦ nums.length ≦ 10 ^ 5
0 ≦ nums[i] ≦ 1
範例測資:
範例 1:
輸入: nums = [0,1,0,0,1]
輸出: 3
解釋: 有 3 種將 nums 分切成好的子陣列之方式:
- [0,1] [0,0,1]
- [0,1,0] [0,1]
- [0,1,0,0] [1]
範例 2:
輸入: nums = [0,1,0]
輸出: 1
解釋: 有 1 種將 nums 分切成好的子陣列之方式:
- [0,1,0]
解題思維:
可以看到 nums 中如果一個 1 都沒有,則方法數很明顯是 0。
接著我們同樣也可以看到,第一個(即最左邊的)1 其左側的所有 0 不管在任何合法分切方式下都會跟第一個 1 在同一個陣列中;最後一個 1 與其右側的 0 也是同理。
而無視掉 0 之後每兩個相鄰的 1 可以看到原本位於其中間的 0(假設兩者中間有 C 個 0)可以從中間切一刀分成左右分別給左右兩個 1。因此其方法數為 C + 1。
因此所有相鄰的 1 之間的「C + 1」之值的乘積即為所求(記得模 10 ^ 9 + 7)。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。