K次串联后最大子数组之和--动态规划

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,这一行代码直接囊括了所有的可能,除了俩个数组以内的

扫描二维码关注公众号,回复: 11325950 查看本文章
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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

猜你喜欢

转载自blog.csdn.net/jump_into_zehe/article/details/106835633