ETH官方钱包

前往
大廳
主題

LeetCode - 2750. Ways to Split Array Into Good Subarrays 解題心得

Not In My Back Yard | 2024-09-18 12:00:01 | 巴幣 0 | 人氣 26

題目連結:


題目意譯:
你被給定一個二元陣列 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)。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創(chuàng)作回應

相關創(chuàng)作

更多創(chuàng)作