[LeetCode] 2270. Number of Ways to Split Array
You are given a 0-indexed integer array nums
of length n
.
nums
contains a valid split at index i
if the following are true:
- The sum of the first
i + 1
elements is greater than or equal to the sum of the lastn - i - 1
elements. - There is at least one element to the right of
i
. That is,0 <= i < n - 1
.
Return the number of valid splits in nums
.
Example 1:
Input: nums = [10,4,-8,7] Output: 2 Explanation: There are three ways of splitting nums into two non-empty parts: - Split nums at index 0. Then, the first part is [10], and its sum is 10. The second part is [4,-8,7], and its sum is 3. Since 10 >= 3, i = 0 is a valid split. - Split nums at index 1. Then, the first part is [10,4], and its sum is 14. The second part is [-8,7], and its sum is -1. Since 14 >= -1, i = 1 is a valid split. - Split nums at index 2. Then, the first part is [10,4,-8], and its sum is 6. The second part is [7], and its sum is 7. Since 6 < 7, i = 2 is not a valid split. Thus, the number of valid splits in nums is 2.
Example 2:
Input: nums = [2,3,1,0] Output: 2 Explanation: There are two valid splits in nums: - Split nums at index 1. Then, the first part is [2,3], and its sum is 5. The second part is [1,0], and its sum is 1. Since 5 >= 1, i = 1 is a valid split. - Split nums at index 2. Then, the first part is [2,3,1], and its sum is 6. The second part is [0], and its sum is 0. Since 6 >= 0, i = 2 is a valid split.
Constraints:
2 <= nums.length <= 105
-105 <= nums[i] <= 105
分割数组的方案数。
给你一个下标从 0 开始长度为 n 的整数数组 nums 。
如果以下描述为真,那么 nums 在下标 i 处有一个 合法的分割 :前 i + 1 个元素的和 大于等于 剩下的 n - i - 1 个元素的和。
下标 i 的右边 至少有一个 元素,也就是说下标 i 满足 0 <= i < n - 1 。
请你返回 nums 中的 合法分割 方案数。来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/number-of-ways-to-split-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
这道题的思路跟2256类似。2256求的是最小的满足条件的 index,这道题其实更简单,就是求符合题意的 index 一共有几个,而且只是单纯的求子数组的和,用前缀和的思路解决即可。
时间O(n)
空间O(1)
Java实现
1 class Solution { 2 public int waysToSplitArray(int[] nums) { 3 long sum = 0; 4 for (int num : nums) { 5 sum += num; 6 } 7 8 int count = 0; 9 int len = nums.length; 10 long left = 0; 11 long right = 0; 12 for (int i = 0; i < len - 1; i++) { 13 left += nums[i]; 14 right = sum - left; 15 if (left >= right) { 16 count++; 17 } 18 } 19 return count; 20 } 21 }