1191. K 次串联后最大子数组之和

K 次串联后最大子数组之和

题目描述:

给你一个整数数组 arr 和一个整数 k。

首先,我们要对该数组进行修改,即把原数组 arr 重复 k 次。

举个例子,如果 arr = [1, 2] 且 k = 3,那么修改后的数组就是 [1, 2, 1, 2, 1, 2]。

然后,请你返回修改后的数组中的最大的子数组之和。

注意,子数组长度可以是 0,在这种情况下它的总和也是 0。

由于 结果可能会很大,所以需要 模(mod) 10^9 + 7 后再返回。

示例 1:

输入:arr = [1,2], k = 3
输出:9
示例 2:

输入:arr = [1,-2,1], k = 5
输出:2
示例 3:

输入:arr = [-1,-2], k = 7
输出:0

提示:

1 <= arr.length <= 10^5
1 <= k <= 10^5
-10^4 <= arr[i] <= 10^4

思路:

需要考虑三种情况,k=1,k=2,k>2,k=1就是最大子序列问题,k=2是两个连续最大子序列问题,k>2是max(ans2,(ans2+(k-2) * sum) ) ,ans2是k=2时最大连续子序列的大小。

代码:

func kConcatenationMaxSum(arr []int, k int) int {
    var r ,ans, ans2 int
    base := 1000000007
    var sum int
    for i:=0; i<len(arr);i++{
        r = max(r+arr[i], arr[i])
        ans = max(r, ans)
        sum += arr[i]
    }
    if k==1{
        return ans %base
    }

    for i:=0; i<len(arr); i++{
        r= max(r+arr[i], arr[i])
        ans2 = max(r, ans2)
    }
    if k ==2{
        return ans2 % base
    }


    return max(ans2,(ans2+(k-2) * sum) % base) % base

}

func max(a, b int)int {
    if a>b {
        return a
    }else{
        return b
    }
}

代码效率:

执行用时:52 ms, 在所有 Go 提交中击败了85.71%的用户
内存消耗:8.3 MB, 在所有 Go 提交中击败了50.00%的用户


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!