力扣1013三等分解法与C++实现

问题本质 :判断一个整数数组 arr 能否被分割成三个和相等的非空连续子数组 。

核心思路:

  1. 必要条件 :数组总和 sum 必须能被 3 整除,即 sum % 3 == 0。否则直接返回 false 。
  2. 目标部分和 :每个部分的目标和 target = sum / 3。
  3. 寻找分割点 :遍历数组,累加当前和 curSum。当 curSum 第一次等于 target 时,找到第一个分割点 i;继续遍历,当 curSum 第二次等于 2 * target 时,找到第二个分割点 j,且此时 j 不能是数组最后一个元素(保证第三部分非空)。
  4. 判断结果:如果成功找到两个分割点,则数组可被分成三个和相等的部分。

C++ 代码实现:

cpp 复制代码
class Solution {
public:
    bool canThreePartsEqualSum(vector<int>& arr) {
        int total = accumulate(arr.begin(), arr.end(), 0);
        // 总和必须能被3整除
        if (total % 3 != 0) {
            return false;
        }
        int target = total / 3;
        int n = arr.size();
        int curSum = 0;
        int count = 0; // 记录找到的和为 target 的段数 for (int i = 0; i < n; ++i) {
            curSum += arr[i];
            // 当累加和等于 target 时,找到一段
            if (curSum == target) {
                count++;
                curSum = 0; // 重置当前和,开始下一段的累加
            }
            // 如果已经找到两段,且当前不是最后一段(即后面还有元素),则成功
            if (count == 2 && i < n - 1) {
                return true;
            }
        }
        // 遍历结束仍未找到两段,或最后一段和不为 target,则失败 return false;
    }
};

复杂度分析:

  • 时间复杂度:O(n),其中 n 是数组长度。仅需一次遍历 。
  • 空间复杂度:O(1),只使用了常数个额外变量 。

参考来源

相关推荐
Discipline10293 小时前
尼泊尔河流流量:天气驱动的预测与高流量风险
人工智能·算法
2601_966949653 小时前
股票池发生变化后,如何高效更新行情数据?从全量刷新到增量同步
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
繁华的地方不一定留下你的脚印3 小时前
C++ std::variant 与 std::visit:安全保存多种类型,写清每个处理分支
开发语言·c++
XuCoder3 小时前
改一个数,右边全得重算,这题怎么扛住两万次查询
算法
小羊没烦恼!3 小时前
在Scrum中实施敏捷建模
java·开发语言·windows·算法·c#
❀͜͡傀儡师3 小时前
20 年沉淀,CAS 8.0 重新定义企业级 SSO:适配 JDK 25 与 Spring Boot 4.1
java·开发语言·spring boot
程序员老陆3 小时前
WIN32_LEAN_AND_MEAN:Windows 头文件里的“精简编译开关”
c++·windows
weixin_307779133 小时前
基于睿擎工业开发平台的预训练视觉模型轻量化适配与低代码部署优化
开发语言·算法
实心儿儿3 小时前
Qt — Qt 多线程
开发语言·qt
小小龙学IT4 小时前
Go 泛型(Generics)深度解析:从类型参数到生产实践
开发语言·数据库·golang