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

题目描述

在这里插入图片描述
在这里插入图片描述

方法一:直接遍历
  • 从前往后遍历,记录下和为sum/3的序列数量,找到3个就返回true
  • 遍历完了,依然没有找到3个和为sum/3的序列,返回false
bool canThreePartsEqualSum(vector<int>& A) {
        int sum = 0;
        for(int num : A)   sum += num;//求和
        if (sum % 3 != 0)   return false;

        int part_sum = 0;
        int count = 0;
        for(int num : A){
            part_sum += num;//当前的部分和
            if(part_sum == sum / 3){
                count++;
                part_sum = 0;
            }
            if(count == 3) return true;
        }
        return false;//遍历完了,count依然不为3
    }
};
方法二:双指针
  • 左指针从左往右找和为sum/3的序列,找到就退出循环,找不到则指针指向最后一个元素
  • 同样的,右指针从右往左找和为sum/3的序列,找到就退出循环,找不到则指针指向0号元素
  • 最后比较两个指针的位置,若中间还有剩余元素,返回true,否则返回false
bool canThreePartsEqualSum(vector<int>& A) {
        int sum = 0;
        for(int num : A)   sum += num;
        if(sum % 3 != 0) return false;
        int l = 0;
        int r = A.size() - 1;
        int l_sum = A[l];
        int r_sum = A[r];
        //左指针寻找,限制区间
        while(l_sum != sum/3 && l < A.size() - 1){
            l++;
            l_sum += A[l];
        }
        //右指针寻找,限制区间
        while(r_sum != sum/3 && r > 0){
            r--;
            r_sum += A[r];
        }
        //比较两指针的相对位置
        if(l < r - 1) return true;
        else return false;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bugcoder-9905

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值