2022-02-16:将数组分割成和相等的子数组。 给定一个有 n 个整数的数组,你需要找到满足以下条件的三元组 (i, j, k) : 0 < i, i + 1 < j, j + 1 < k < n - 1 子数组 (0, i - 1),(i + 1, j - 1),(j + 1, k - 1),(k + 1, n - 1) 的和应该相等。 这里我们定义子数组 (L, R) 表示原数组从索引为L的元素开始至索引为R的元素。 示例: 输入: [1,2,1,2,1,2,1] 输出: True 解释: i = 1, j = 3, k = 5. sum(0, i - 1) = sum(0, 0) = 1 sum(i + 1, j - 1) = sum(2, 2) = 1 sum(j + 1, k - 1) = sum(4, 4) = 1 sum(k + 1, n - 1) = sum(6, 6) = 1 注意: 1 <= n <= 2000。 给定数组中的元素会在 [-1,000,000, 1,000,000] 范围内。 力扣548。

答案2022-02-16:

暴力枚举。 时间复杂度:O(N**3)。 空间复杂度:O(N)。

代码用golang编写。代码如下:

package main

import "fmt"

func main() {
    ret := splitArray([]int{1, 2, 1, 2, 1, 2, 1})
    fmt.Println(ret)
}

func splitArray(nums []int) bool {
    if len(nums) < 7 {
        return false
    }
    sumLeftToRight := make([]int, len(nums))
    sumRightToLeft := make([]int, len(nums))
    s := 0
    for i := 0; i < len(nums); i++ {
        sumLeftToRight[i] = s
        s += nums[i]
    }
    s = 0
    for i := len(nums) - 1; i >= 0; i-- {
        sumRightToLeft[i] = s
        s += nums[i]
    }
    for i := 1; i < len(nums)-5; i++ {
        for j := len(nums) - 2; j > i+3; j-- {
            if sumLeftToRight[i] == sumRightToLeft[j] && find(sumLeftToRight, sumRightToLeft, i, j) {
                return true
            }
        }
    }
    return false
}

func find(sumLeftToRight, sumRightToLeft []int, l, r int) bool {
    s := sumLeftToRight[l]
    prefix := sumLeftToRight[l+1]
    suffix := sumRightToLeft[r-1]
    for i := l + 2; i < r-1; i++ {
        s1 := sumLeftToRight[i] - prefix
        s2 := sumRightToLeft[i] - suffix
        if s1 == s2 && s1 == s {
            return true
        }
    }
    return false
}

执行结果如下: 图片


左神java代码