leetcode 1013. 将数组分成和相等的三个部分

85 阅读1分钟

[toc] leetcode 1013. 将数组分成和相等的三个部分.

题目描述

  1. 将数组分成和相等的三个部分

给你一个整数数组 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多平台发布