LeetCode 1191
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
解法
解题思路:因为是K次串联,意味着如果超过K>2,那么中间肯定是有一个完整的数组的,因此我们可以把问题简化,我们只要求出一个数组的最大子数组和或两个数组的最大子数组和,其他的待串联数组直接穿插在中间就可以了
(Math.max(sum,0)*(k-2)+max)%1000000007
如果这一个数组的和大于0,那么我们肯定是要把k-2
个数组全部插入的,如果这一个数组的和小于0,那么不管多少个数组,我们都不要,直接置为0,这一行代码直接囊括了所有的可能,除了俩个数组以内的
if(k<=2)
return (int)(max%1000000007);
这一代码就解决了两个数组以内的最大子数组和
完整代码
class Solution {
public long kConcatenationMaxSum(int[] arr, int k) {
long s = 0;
long max = 0;
long sum = 0;
int i;
for(i=0; i<arr.length; i++)
sum+=arr[i]; //数组和
for(i=0; i<arr.length*(Math.min(2, k)); i++)
//一个或两个数组的最大子数组和
{
if(s<0)
s=arr[i%arr.length];
else
s=s+arr[i%arr.length];
if(s>max)
max = s;
}
if(k<=2) //如果只有一个数组或两个数组串联
return max;
else//否则将剩下的k-2个数组插到中间去
return (Math.max(sum,0)*(k-2)+max)%1000000007;
}
}
心得体会
刚开始解题时,多个数组串联我还是用之前的方法,直接就爆时间了,没有想到这种方法,感觉想的还是没那么深
题目和解法来源
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/k-concatenation-maximum-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。