力扣周末回顾5 -1013题 将数组分成和相等的三个部分

周末回顾题5

原题:点击此处

数组简单题,做一下用来放松。

考点:数组,双指针

解题:

1.如果数组长度不够3,fasle;

2.如果数组总和取余不为0,false;

3.数组总和除3,得到判断条件situation。

3.双指针思想:

左边设一个指针,右边设一个指针。

左边往右边遍历,找到总和等于situation的时候停下。

右边往左边遍历,找到总和等于situation的时候停下。

为了保证三等分,当左边指针到《length-2》这个位置的时候,就必须停下来。右边指针和左边指针重合时,也必须停下来。

4.注意!下面这段代码的用意,为什么不能设置从0开始?
因为会存在边界条件。

int left = A[0];
int right = A[A.length-1];

下面为完整代码:
(写得不够简约,不过思路应该比较明朗)

class Solution {
    public boolean canThreePartsEqualSum(int[] A) {
        // 特殊条件
        if(A.length < 3){
            return false;
        }
        int total = 0;
        for(int i:A){
            total += i;
        }
        int situation = total / 3;
        // 如果不能三等分,也没必要算了
        if(total % 3 != 0){
            return false;
        }
        int left = A[0];
        int right = A[A.length-1];
        int lstart = 1;
        int rstart = A.length-2;
        while(left != situation){
            // 防止过分加
            if(lstart == A.length -2){
                break;
            }
            left += A[lstart];
            lstart++;
        }
        while(right != situation){
            // 指针重合说明已经到达三等分的极限了
            if(rstart == lstart){
                break;
            }
            right += A[rstart];
            rstart--;
        }
        if(left == right && left == situation){
            return true;
        }
        return false;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值