[toc] leetcode 1013. 将数组分成和相等的三个部分.
题目描述
- 将数组分成和相等的三个部分
给你一个整数数组 arr,只有可以将其划分为三个和相等的 非空 部分时才返回 true,否则返回 false。
形式上,如果可以找出索引 i + 1 < j 且满足 (arr[0] + arr[1] + ... + arr[i] == arr[i + 1] + arr[i + 2] + ... + arr[j - 1] == arr[j] + arr[j + 1] + ... + arr[arr.length - 1]) 就可以将数组三等分。
示例 1:
输入:arr = [0,2,1,-6,6,-7,9,1,2,0,1] 输出:true 解释:0 + 2 + 1 = -6 + 6 - 7 + 9 + 1 = 2 + 0 + 1 示例 2:
输入:arr = [0,2,1,-6,6,7,9,-1,2,0,1] 输出:false 示例 3:
输入:arr = [3,3,6,5,-2,2,5,1,-9,4] 输出:true 解释:3 + 3 = 6 = 5 - 2 + 2 + 5 + 1 - 9 + 4
提示:
3 <= arr.length <= 5 * 104 -104 <= arr[i] <= 104
解题思路
法1
首先计算数组 arr 的总和 sum。然后,检查 sum 是否可以被 3 整除,如果不能整除,则无法将数组划分为三个和相等的非空部分,返回 false。
接下来,将目标和 targetSum 设置为 sum 的三分之一。使用一个变量 partSum 来记录当前部分的和,另一个变量 count 来记录符合条件的部分的数量。
然后,遍历数组 arr,累加当前元素到 partSum。如果 partSum 等于 targetSum,表示找到一个符合条件的部分,将 partSum 重置为 0,并将 count 加一。
最后,判断 count 是否大于等于 3,如果是,则表示可以将数组划分为三个和相等的非空部分,返回 true;否则,返回 false。
- 时间复杂度(O(n))
- 空间复杂度(O(n))
执行结果
法1
func canThreePartsEqualSum(arr []int) bool {
sum := 0
for _, num := range arr {
sum += num
}
if sum%3 != 0 {
return false
}
targetSum := sum / 3
partSum := 0
count := 0
for i := 0; i < len(arr); i++ {
partSum += arr[i]
if partSum == targetSum {
partSum = 0
count++
}
}
return count >= 3
}
执行结果: 通过 显示详情 查看示例代码 添加备注
执行用时: 40 ms , 在所有 Go 提交中击败了 73.56% 的用户 内存消耗: 7.1 MB , 在所有 Go 提交中击败了 85.06% 的用户 通过测试用例: 72 / 72 炫耀一下:
本文由mdnice多平台发布