[LeetCode] 2270. Number of Ways to Split Array
阿新 • • 發佈:2022-12-06
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 }