Python程式:查詢將陣列分成三個子陣列的方法數
假設我們有一個名為nums的陣列,我們需要找到將此陣列nums劃分成好方法的數量。答案可能非常大,因此返回結果模10^9 + 7。這裡,如果陣列被分成三個非空的連續子陣列(從左到右),並且左側元素的和小於或等於中間部分元素的和,中間部分元素的和小於或等於右側部分元素的和,則該陣列劃分是好的。
因此,如果輸入類似於nums = [2,3,3,3,7,1],則輸出將為3,因為存在三種不同的劃分方法。
- [2],[3],[3,3,7,1]
- [2],[3,3],[3,7,1]
- [2,3],[3,3],[7,1]
為了解決這個問題,我們將遵循以下步驟:
- n := nums的大小
- m := 10^9+7
- ss := 一個大小為(1+n)並填充0的陣列
- 對於nums中的每個索引i和值val,執行:
- ss[i] := ss[i-1] + val
- r := 0, rr := 0, ans := 0
- 對於l從1到n-2,執行:
- r := r和l+1的最大值
- 當r < n-1且ss[r] - ss[l] < ss[l]時,執行:
- r := r + 1
- rr := rr和r的最大值
- 當rr < n-1且ss[n] - ss[rr+1] >= ss[rr+1] - ss[l]時,執行:
- rr := rr + 1
- 如果ss[l] > ss[r] - ss[l],則
- 跳出迴圈
- 如果ss[r] - ss[l] > ss[n] - ss[r],則
- 進行下一次迭代
- ans := (ans + rr - r + 1) mod m
- 返回ans
示例
讓我們看看下面的實現以更好地理解:
def solve(nums): n, m = len(nums), 10**9+7 ss = [0] * (1+n) for i, val in enumerate(nums, 1): ss[i] = ss[i-1] + val r = rr = ans = 0 for l in range(1, n-1): r = max(r, l+1) while r < n-1 and ss[r]-ss[l] < ss[l]: r += 1 rr = max(rr, r) while rr < n-1 and ss[n]-ss[rr+1] >= ss[rr+1]-ss[l]: rr += 1 if ss[l] > ss[r]-ss[l]: break if ss[r]-ss[l] > ss[n]-ss[r]: continue ans = (ans+rr-r+1) % m return ans nums = [2,3,3,3,7,1] print(solve(nums))
輸入
[1,7,3,6,5]
輸出
3
廣告