548. 将数组分割成和相等的子数组 🔒
题目描述
给定一个有 n
个整数的数组 nums
,如果能找到满足以下条件的三元组 (i, j, k)
则返回 true
:
0 < i, i + 1 < j, j + 1 < k < n - 1
- 子数组
(0, i - 1)
,(i + 1, j - 1)
,(j + 1, k - 1)
,(k + 1, n - 1)
的和应该相等。
这里我们定义子数组 (l, r)
表示原数组从索引为 l
的元素开始至索引为 r
的元素。
示例 1:
输入: nums = [1,2,1,2,1,2,1] 输出: True 解释: i = 1, j = 3, k = 5. sum(0, i - 1) = sum(0, 0) = 1 sum(i + 1, j - 1) = sum(2, 2) = 1 sum(j + 1, k - 1) = sum(4, 4) = 1 sum(k + 1, n - 1) = sum(6, 6) = 1
示例 2:
输入: nums = [1,2,1,2,1,2,1,2] 输出: false
提示:
n == nums.length
1 <= n <= 2000
-106 <= nums[i] <= 106
解法
方法一:前缀和 + 哈希表
先求出前缀和数组 s。
然后遍历 j 所有可能的位置,对于每个 j,找出 i,使得前两个子数组的和相等。同时将和添加到哈希表中。
接着对于每个 j,找出 k,使得后两个子数组的和相等,然后判断哈希表中是否存在该和,如果存在,则找到满足条件的三元组 (i, j, k)
,返回 true。
否则遍历结束返回 false。
时间复杂度 $O(n^2)$。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|