3月打卡活动第11天 LeetCode第1013题:将数组分成和相等的三个部分(简单)

3月打卡活动第11天 LeetCode第1013题:将数组分成和相等的三个部分(简单)

  • 题目:给你一个整数数组 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]) 就可以将数组三等分。
    在这里插入图片描述
  • 解题思路:自从我知道了双指针的方法,简直不要太好用~要注意第二个部分不可以没有数字。
class Solution {
    public boolean canThreePartsEqualSum(int[] A) {
        boolean ans = false;
        int len = A.length;
        if(len==0) return false;
        int left = 0;
        int right = len-1;
        int sum1=A[0],sum3=A[len-1];
        int sum=0;
		//求数组的和
        for(int i=0;i<len;i++) sum+=A[i];
		//如果和不能被3整除,则不能等分
        if(sum%3==0){
            sum=sum/3;
        }else{
            return ans;
        }
		//左指针与右指针之间至少还有一个数字
        while(left<right-1){
            if(sum1!=sum){
                left++;
                sum1+=A[left];
            }
            if(sum3!=sum){
                right--;
                sum3+=A[right];
            }
            if(left<right-1 && sum1==sum3 && sum1==sum){
                ans = true;
                break;
            } 
        }
        
        return ans;
    }
}

在这里插入图片描述

  • 题解做法:整体遍历一遍,声明flag的想法感觉也挺好。
class Solution {
    public boolean canThreePartsEqualSum(int[] A) {
        int sum = 0;
        for(int i: A){
            sum += i;
        }
        if(sum%3 != 0){
            // 总和不是3的倍数,直接返回false
            return false;
        }
        int s = 0;
        int flag = 0;
        for(int i:A){
            s += i;
            if(s == sum/3){
                flag++;
                s = 0;
            }
        }
        // flag不一定等于3,例如[1,-1,1,-1,1,-1,1,-1]
        return flag >= 3;
    }
}

作者:sugar-31
链接:https://leetcode-cn.com/problems/partition-array-into-three-parts-with-equal-sum/solution/java-shi-yong-shuang-zhi-zhen-by-sugar-31/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值