美文网首页
Leetcode_1013_将数组分成和相等的三个部分_hn

Leetcode_1013_将数组分成和相等的三个部分_hn

作者: 1只特立独行的猪 | 来源:发表于2020-03-11 18:26 被阅读0次

题目描述

给你一个整数数组 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

提示:

3 <= A.length <= 50000
-10^4 <= A[i] <= 10^4

解答方法

方法一:寻找切分点

思路

  • 首先计算数组 A 中所有数字总和 sum
  • 遍历数组 AA 查找和为 sum / 3的子数组个数
  • 如果找到了三个这样的子数组则返回true
  • 找不到三个就返回 false

代码

class Solution:
    def canThreePartsEqualSum(self, A: List[int]) -> bool:
        s = sum(A)
#数组元素的总和 sum 不是3的倍数,直接返回false
        if s % 3 != 0:
            return False
        cout = 0
        sub_sum = 0
        for i in A:
            sub_sum += i
            if sub_sum == s / 3:
                cout += 1
                sub_sum = 0
# cout不一定等于3,例如[1,-1,1,-1,1,-1,1,-1]
        return cout >= 3

时间复杂度

O(n)

空间复杂度

方法二:双指针法

思路

  • 数组元素的总和 sum 不是3的倍数,直接返回false
  • 使用双指针left,right, 从数组两头开始一起找,节约时间
    • 当 left + 1 < right 的约束下,可以找到数组两头的和都是 sum/3,那么中间剩下的元素和就一定也是sum/3
      (left + 1 < right的约束就是要中间有剩下的元素,使用left < right的约束,数组可能可以恰好被划分成两部分,中间没有元素)

作者: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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

代码

class Solution:
    def canThreePartsEqualSum(self, A: List[int]) -> bool:
        s = sum(A)
        if s % 3 != 0:
            return False
        left = 0
        right = len(A) - 1
        left_sum = A[left]
        right_sum = A[right]
        while left + 1 < right:
            if left_sum == s / 3 and right_sum == s / 3:
                return True
            if left_sum != s / 3:
                left+=1
                left_sum += A[left]
            if right_sum != s / 3:
                right -= 1
                right_sum += A[right]
        return False

相关文章

网友评论

      本文标题:Leetcode_1013_将数组分成和相等的三个部分_hn

      本文链接:https://www.haomeiwen.com/subject/extnjctx.html