zoukankan      html  css  js  c++  java
  • 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])就可以将数组三等分。

    示例 1:

    输出:[0,2,1,-6,6,-7,9,1,2,0,1]
    输出:true
    解释:0 + 2 + 1 = -6 + 6 - 7 + 9 + 1 = 2 + 0 + 1
    

    示例 2:

    输入:[0,2,1,-6,6,7,9,-1,2,0,1]
    输出:false
    

    示例 3:

    输入:[3,3,6,5,-2,2,5,1,-9,4]
    输出:true
    解释:3 + 3 = 6 = 5 - 2 + 2 + 5 + 1 - 9 + 4 
    

    提示:

    1. 3 <= A.length <= 50000
    2. -10000 <= A[i] <= 10000

    解题思路

    这个问题非常简单,我们首先计算sum(A)%3==0,如果不是的话,自然就不能拆分为3份。然后接着判断是不是有3small//3即可。

    static const auto _ = []()
    {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
        return nullptr;
    }();
    
    class Solution {
    public:
        bool canThreePartsEqualSum(vector<int>& A) {
            int s= accumulate(A.begin(),A.end(),0);
            if(s % 3!=0)
                return false;
            int target = s / 3;
            int n=A.size(),i = 0,cur = 0;
            while(i<n){
                cur += A[i];
                if (cur == target) {
                    break;
                }
                ++i;
            }
            if(cur!=target)
                return false;
            int j=i+1;
            while(j+1<n){
                cur += A[j];
                if (cur == target * 2) {
                    return true;
                }
                ++j;
            }
            return false;
        }
    };
    
  • 相关阅读:
    反射、面向对象(基础篇)
    配置文件
    模块补充 、迭代器和 生成器
    模块
    正则表达式
    冒泡排序、递归和简单装饰器
    使用Apache Archiva管理Maven仓库
    AppScan9.0.3.5漏洞扫描记录
    Linux环境下安装Websphere8.5.5
    如何排查网络通讯状况
  • 原文地址:https://www.cnblogs.com/RioTian/p/12460398.html
Copyright © 2011-2022 走看看