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 协议 ,转载请注明出处!