每日一题——LeetCode1013.将数组分成和相等的三个部分

发布时间:2024年01月04日

方法一 个人方法:

既然和能被分成三部分,那么数组的和一定是3的倍数,所以先求和sum,如果sum不能整除3则直接返回false

按照题意,三个部分是按照数组原顺序分成的,那么从数组开头开始每一项求和,当和等于sum/3时代表已经找到第一组,将count重置为0继续寻找第二组,res记录满足和为sum/3的组数

当res===3的时候就代表刚好找到三组和为sum/3即满足题意,res>=3的条件是为了满足arr里元素都为0的特殊情况

var canThreePartsEqualSum = function(arr) {
    var sum = arr.reduce((a,b)=>a+b,0)
    var count=0,res=0
    if(sum%3!=0) return false
    for(var i=0;i<arr.length;i++){
        count+=arr[i]
        if(count===sum/3){
            count=0
            res++
        }
    }
    return res>=3
};

?消耗时间和内存情况:

方法二 动态规划:

维护一个数组res,res[i]=arr[0]+arr[1]+...+arr[i-1]+arr[i],根据分析可得:

1、res[res.length-1]即为arr数组的和,它应该能被3整除,如果不能则返回false

2、假设分成三部分和都为n,那么res[res.length-1]===3n,且必然存在p,q,使得

0<p<q<res.length-2,且res[p]=n,res[q]=2n

var canThreePartsEqualSum = function(arr) {
    let res = [arr[0]];
    for (let i = 1; i < arr.length; i++) {
        res.push(res[i - 1] + arr[i]);
    }
    let single = res[res.length - 1] / 3;
    let part1 = res.indexOf(single);
    let part2 = res.indexOf(single * 2, part1 + 1);
    return part2 > part1 && part1 > -1 && part2 < res.length - 1;
};

消耗时间和内存情况:

文章来源:https://blog.csdn.net/weixin_52878347/article/details/135387816
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。