Leetcode 1013.将数组分成和相等的三个部分【C++】

本文最后更新于:2023年2月8日 晚上

地址:https://leetcode-cn.com/problems/partition-array-into-three-parts-with-equal-sum/

题目

给你一个整数数组 A,只有可以将其划分为三个和相等的非空部分时才返回 true,否则返回 false

形式上,如果可以找出索引 i+1 < j 且满足 (A[0] + A[1] + ... + A[i] == A[i+1] + A[i+2] + ... + A[j-1] == A[j] + A[j-1] + ... + A[A.length - 1]) 就可以将数组三等分。

示例 1:

输出:[0,2,1,-6,6,-7,9,1,2,0,1]
输出:true
解释:0 + 2 + 1 = -6 + 6 - 7 + 9 + 1 = 2 + 0 + 1

示例 2:

输入:[0,2,1,-6,6,7,9,-1,2,0,1]
输出:false

示例 3:

输入:[3,3,6,5,-2,2,5,1,-9,4]
输出:true
解释:3 + 3 = 6 = 5 - 2 + 2 + 5 + 1 - 9 + 4

提示:

  • 3 <= A.length <= 50000
  • -10^4 <= A[i] <= 10^4

解题思路

这个题不难,首先需要明白的是,如果一个数组能如题述那样分成三等分,那么这三个和相等,并且三个等分的和相加即为整个数组所有元素的和。

求整个数组的和 sum 是很简单的,如果这个数组能三等分则每个等分的和即为 sum/3 ,所以我们只需要遍历数组,逐个元素相加求和 sumOfPart,一旦 sumOfPart == sum / 3 则说明找到了一个等分,此时将 sumOfPart 重置为0(以开始计算新的一部分的部分和),并将 part++ 表示新找到了一个等分。

特别需要注意的是,当 sum == 0 的时候,sumOfPart == 0 是可能存在多个部分的,即 part >= 3,但不能小于3,因为至少需要三等分。

代码

class Solution {
public:
    bool canThreePartsEqualSum(vector<int>& A) {
        //计算整个数组的和
        int sum = 0;
        for (auto a : A) {
            sum += a;
        }
        int part = 0;//计数和为sum/3的分组数
        int sumOfPart = 0;//部分和
        for (auto a : A) {
            sumOfPart += a;
            if (sumOfPart == sum / 3) {
                sumOfPart = 0;//将部分和重置为0
                part++;//组数+1
            }
        }
        //当sum==0的时候part存在大于3的情况,但不可能小于3
        return part >= 3 ? true : false;
    }
};

Leetcode 1013.将数组分成和相等的三个部分【C++】
https://mxy493.xyz/2020031157295/
作者
mxy
发布于
2020年3月11日
许可协议