【力扣刷题】1013. 将数组分成和相等的三个部分

943 阅读1分钟

「这是我参与11月更文挑战的第 24 天,活动详情查看:2021最后一次更文挑战

原题链接

1013. 将数组分成和相等的三个部分 - 力扣(LeetCode) (leetcode-cn.com)

题目描述

给你一个整数数组 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.length <= 5 * 104
  • -104 <= arr[i] <= 104

分析

初看题目,以为需要使用贪心去将数组元素划分为3块,保证每一块的数据之和都相等。但仔细阅读后,其实是在原数组上,直接切两刀,我们只需要定位到这两刀切割的位置,以及数组是否可以通过这种方式去获得3个和相等的部分

注意,我们需要保证每个子数组都起码包含一个元素!

我们需要计算出数组的总和,再获得每个子数组的和

在数组可以切分成 3 份的情况下,我们只需要求出前2部分的数组和的界限位置,如果求出了 2 个分界线,并且最后一个数组还有元素,就可以返回 true;除这情况之外,都需要返回 false

代码

var canThreePartsEqualSum = function(arr) {
    let sum = arr.reduce((a, b) => a + b, 0);
    if (sum % 3 != 0) return false;
    let avg = sum / 3;
    let n = 2;
    // 从头开始遍历,找到 i,j
    let count = 0;
    for (let i = 0; i < arr.length - 1; i++) {
        count += arr[i];
        if (count == avg) {
            n--;
            count = 0;
        }
        if (n == 0) {
            break;
        }
    }
    return n == 0;
};

image.png


今天的力扣刷题就分享到这里,感谢大家的阅读~