一、题目描述:
给你一个整数数组 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来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/k-concatenation-maximum-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、解题思路:
1、主要注意边界条件
1)计算出数组中最大子数组和 sum_sub_max,数组总和sum。
2)当数组大于1的时候
a)当数组总和sum大于0的时候,计算左边总数和为负数的最小值sum_lt和右边总数和为负数的最小值sum_rt。计算sum_all = sum*k - sum_lt - sum_rt
b)将两个数组拼起来,计算拼接起来当数组最大子数组和sum_sub_max1
上面三种情况取最大值max(sum_sub_max,sum_all,sum_sub_max1)就是拼接之后的数组当最大子数组和
三、代码
func kConcatenationMaxSum(arr []int, k int) int {
sum := 0
sumr := 0
left :=0
var lena int
lena = len(arr)
right := lena - 1
sum_max :=0
sum_all := 0
for i := 0; i < lena; i ++{
sum_all += arr[i]
j := lena - i - 1
if sum < 0{
left = i
sum = 0
}
sum += arr[i]
if sumr < 0{
right = j
sumr = 0
}
sumr += arr[j]
if sum_max < sum{
sum_max = sum
}
}
sums := sum_all * k
sum_t := 0
if left > 0{
for i := 0; i < left;i++{
sum_t += arr[i]
}
}
sum_tr := 0
if right < lena{
for j :=lena -1 ; j > right;j--{
sum_tr += arr[j]
}
}
if k <= 1{
return sum_max
}
if sum_t < 0{
sums -= sum_t
}
if(sum_tr < 0){
sums -= sum_tr
}
sum_ml := 0
sum_mr := 0
sum_sl := 0
sum_sr := 0
if sum_all < 0{
for i := 0; i < lena;i++{
j := lena - i -1
sum_ml += arr[i]
if(sum_ml > sum_sl){
sum_sl = sum_ml
}
sum_mr += arr[j]
if(sum_mr > sum_sr){
sum_sr = sum_mr
}
}
}
var r_sum int = max(sums,sum_max)
r_sum = max(r_sum,sum_sl + sum_sr)
max_mod := 1000000000 + 7
return r_sum % max_mod;
}
func max(l int, r int) int{
if l > r{
return l
}
return r
}