2021-08-28:给定一个正数数组arr,长度一定大于6(>=7),一定要选3个数字做分割点,从而分出4个部分,并且每部分都有数,分割点的数字直接删除,不属于任何4个部分中的任何一个。 返回有没有

Posted 福大大架构师每日一题

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021-08-28:给定一个正数数组arr,长度一定大于6(>=7),一定要选3个数字做分割点,从而分出4个部分,并且每部分都有数,分割点的数字直接删除,不属于任何4个部分中的任何一个。 返回有没有相关的知识,希望对你有一定的参考价值。

2021-08-28:给定一个正数数组arr,长度一定大于6(>=7),一定要选3个数字做分割点,从而分出4个部分,并且每部分都有数,分割点的数字直接删除,不属于任何4个部分中的任何一个。 返回有没有可能分出的4个部分累加和一样大,如:{3,2,3,7,4,4,3,1,1,6,7,1,5,2},可以分成{3,2,3}、{4,4}、{1,1,6}、{1,5,2}。分割点是不算的!

福大大 答案2021-08-28:

前缀和存map。i位置作为第1刀。
时间复杂度:O(N)。
空间复杂度:O(N)。

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

package main

import "fmt"

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

func canSplits2(arr []int) bool {
    if len(arr) < 7 {
        return false
    }
    // key 某一个累加和, value出现的位置
    map0 := make(map[int]int)
    sum := arr[0]
    for i := 1; i < len(arr); i++ {
        map0[sum] = i
        sum += arr[i]
    }
    lsum := arr[0]                       // 第一刀左侧的累加和
    for s1 := 1; s1 < len(arr)-5; s1++ { // s1是第一刀的位置
        checkSum := lsum*2 + arr[s1] // 100 x 100   100*2 + x
        if _, ok := map0[checkSum]; ok {
            s2 := map0[checkSum] // j -> y
            checkSum += lsum + arr[s2]
            if _, ok := map0[checkSum]; ok { // 100 * 3 + x + y
                s3 := map0[checkSum] // k -> z
                if checkSum+arr[s3]+lsum == sum {
                    return true
                }
            }
        }
        lsum += arr[s1]
    }
    return false
}

执行结果如下:


左神java代码

以上是关于2021-08-28:给定一个正数数组arr,长度一定大于6(>=7),一定要选3个数字做分割点,从而分出4个部分,并且每部分都有数,分割点的数字直接删除,不属于任何4个部分中的任何一个。 返回有没有的主要内容,如果未能解决你的问题,请参考以下文章

[程序员代码面试指南]数组和矩阵问题-未排序正数数组中累加和为给定值的最长子数组长度

2021-05-01:给定一个有序数组arr,代表坐落在X轴上的点。给定一个正数K,代表绳子的长度。返回绳子最多压中几个点?即使绳子边缘处盖住点也算盖住。

2022-01-12:给定一个正数数组arr,长度为n,下标0~n-1, arr中的0n-1位置不需要达标,它们分别是最左最右的位置, 中间位置i需要达标,达标的条件是 : arr[i-1] >

[算法]最长子数组问题

2022-05-20:给定一个正数数组arr,长度为N,依次代表N个任务的难度,给定一个正数k, 你只能从0任务开始,依次处理到N-1号任务结束,就是一定要从左往右处理任务, 只不过,难度差距绝对值不

2022-05-21:给定一个数组arr,长度为n, 表示n个服务员,每个人服务一个人的时间。 给定一个正数m,表示有m个人等位。 如果你是刚来的人,请问你需要等多久? 假设:m远远大于n,比如n<=