列表

详情


2270. 分割数组的方案数

给你一个下标从 0 开始长度为 n 的整数数组 nums 。
如果以下描述为真,那么 nums 在下标 i 处有一个 合法的分割 :

请你返回 nums 中的 合法分割 方案数。

 

示例 1:

输入:nums = [10,4,-8,7]
输出:2
解释:
总共有 3 种不同的方案可以将 nums 分割成两个非空的部分:
- 在下标 0 处分割 nums 。那么第一部分为 [10] ,和为 10 。第二部分为 [4,-8,7] ,和为 3 。因为 10 >= 3 ,所以 i = 0 是一个合法的分割。
- 在下标 1 处分割 nums 。那么第一部分为 [10,4] ,和为 14 。第二部分为 [-8,7] ,和为 -1 。因为 14 >= -1 ,所以 i = 1 是一个合法的分割。
- 在下标 2 处分割 nums 。那么第一部分为 [10,4,-8] ,和为 6 。第二部分为 [7] ,和为 7 。因为 6 < 7 ,所以 i = 2 不是一个合法的分割。
所以 nums 中总共合法分割方案受为 2 。

示例 2:

输入:nums = [2,3,1,0]
输出:2
解释:
总共有 2 种 nums 的合法分割:
- 在下标 1 处分割 nums 。那么第一部分为 [2,3] ,和为 5 。第二部分为 [1,0] ,和为 1 。因为 5 >= 1 ,所以 i = 1 是一个合法的分割。
- 在下标 2 处分割 nums 。那么第一部分为 [2,3,1] ,和为 6 。第二部分为 [0] ,和为 0 。因为 6 >= 0 ,所以 i = 2 是一个合法的分割。

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: int waysToSplitArray(vector<int>& nums) { } };

golang 解法, 执行用时: 120 ms, 内存消耗: 9 MB, 提交时间: 2023-08-22 15:14:46

func waysToSplitArray(nums []int) (ans int) {
	sum := 0
	for _, v := range nums { sum += v }
	for i, s := 0, 0; i < len(nums)-1; i++ {
		s += nums[i]
		if s*2 >= sum { ans++ }
	}
	return
}

python3 解法, 执行用时: 236 ms, 内存消耗: 31.6 MB, 提交时间: 2023-08-22 15:13:45

class Solution:
    def waysToSplitArray(self, nums: List[int]) -> int:
        s, n, ans = sum(nums), len(nums), 0
        preSum = [0 for _ in range(n)]
        preSum[0] = nums[0]
        if preSum[0] * 2 >= s: ans += 1
        for i in range(1, n):
            preSum[i] = preSum[i-1] + nums[i]
            if preSum[i] * 2 >= s and i != n-1:
                ans += 1
        return ans

上一题