【数论】C030_将数组分成和相等的三个部分(对 3 取余)

一、题目描述


二、题解

方法一:枚举

题意化简:求 A 的总和可以被分成 3 个相等的部分。

  • 首先排除第一种情况:total 不能被 3 整除。
  • 然后才能考虑第二种情况:可以被 3 整除,继续判断这个数组能否用 3 个子数组组成 t o t a l / 3 total / 3 这个值。
public boolean canThreePartsEqualSum(int[] A) {
  int total = 0;
  for (int i : A) total += i;

  if (total % 3 != 0)
      return false;
  
  int sum = total / 3;
  int t = 0, cnt = 0;
  for (int a : A) {
    t += a;
    if (t == sum) {
      cnt++;
      t = 0;
    }
  }
  return cnt >= 3;
}

在 sum % 3 == 0 的前提下,不可能出现 cnt > 3 而 s u m × c n t = = t o t a l sum × cnt == total 的情况,除非 total = 0

复杂度分析

  • 时间复杂度: O ( n ) O(n)
  • 空间复杂度: O ( 1 ) O(1)

方法二:优化

如果在倒数第 1 个元素之前就能找到两个和为 sub 的子数组,直接返回 true。

public boolean canThreePartsEqualSum(int[] A) {
	int total = 0;
	for (int a : A) total += a;
	if (total % 3 != 0) return false;
	
	int sub = total / 3;
	int cnt = 0, cur = 0;
	for (int i = 0; i < A.length - 1; i++) {
	    cur += A[i];
	    if (cur == sub) {
	        cnt++;
	        if (cnt == 2) 
	            return true;
	        cur = 0;
	    }
	}
	return false;
}

复杂度分析

  • 时间复杂度: O ( n ) O(n) ,最差为 O(n)
  • 空间复杂度: O ( 1 ) O(1)
发布了495 篇原创文章 · 获赞 105 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_43539599/article/details/104790866