2022-02-16:将数组分割成和相等的子数组。 给定一个有 n 个整数的数组,你需要找到满足以下条件的三元组 (i, j, k) : 0 < i, i + 1 < j, j + 1 < k < n

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代码

posted @ 2022-02-16 22:11  福大大架构师每日一题  阅读(53)  评论(0编辑  收藏  举报  来源