跳至主要內容

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

daipeng大约 2 分钟

给你一个整数数组 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

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/partition-array-into-three-parts-with-equal-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

刚开始理解错了,以为是将数组里的元素分成三组,每组的和相同,后来仔细一看,是将数组分成三段,也就是在中间砍两刀,这下就简单多了,我们先计算出数组总和,再计算出每部分的和,然后用双指针从头和尾分别计算,达到目标后就停止。

public boolean canThreePartsEqualSum(int[] arr) {
        int sum = Arrays.stream(arr).sum();
        if (sum % 3 != 0) {
            return false;
        }
       int part = sum / 3; //部分和
       int left = 0;
       int leftSum = 0;
       while (left < arr.length) {
            leftSum += arr[left];
            if (leftSum == part) {
                break;
            }
            left++;
        }
        if (left >= arr.length - 2) { //中间和尾部至少需要剩下两个元素
            return false;
        }
        int right = arr.length - 1;
        int rightSum = 0;
        while (right >= left + 1) { //中间只要保留一个元素,所以right的下界是left+1
            rightSum += arr[right];
            if (rightSum == part) {
                break;
            }
            right--;
        }
        if (rightSum == part && leftSum == part) { //如果两个部分满足了,那么剩下的也一定满足
            return true;
        }
        return false;
    }