• 1031. Maximum Sum of Two Non-Overlapping Subarrays


    问题:

    给定数组,求两个固定长度M和L的子数组(不相交)之和最大为多少

    Example 1:
    Input: A = [0,6,5,2,2,5,1,9,4], L = 1, M = 2
    Output: 20
    Explanation: One choice of subarrays is [9] with length 1, and [6,5] with length 2.
    
    Example 2:
    Input: A = [3,8,1,3,2,1,8,9,0], L = 3, M = 2
    Output: 29
    Explanation: One choice of subarrays is [3,8,1] with length 3, and [8,9] with length 2.
    
    Example 3:
    Input: A = [2,1,5,6,0,9,5,0,3,8], L = 4, M = 3
    Output: 31
    Explanation: One choice of subarrays is [5,6,0,9] with length 4, and [3,8] with length 3. 
    
    Note:
    L >= 1
    M >= 1
    L + M <= A.length <= 1000
    0 <= A[i] <= 1000
    

      

    解法:

    L和M的关系可能为以下两种:

    [..L..M..]

    [..M..L..]

    我们可以固定右边的子数组M(或L)

    求左边的子数组最大和Lmax(或Mmax)

    对每一组Lmax+M,求最大和,再向右移动M

    同样,对每一组Mmax+L,求最大和,再向右移动L

    再对这两种情况求最大值。res=max(res, max(Lmax+M, Mmax+L))

    另,子数组求和,我们可利用前缀数组求和法。

    sum(i~j)=presum(j)-presum(i-1)

    代码参考:

     1 class Solution {
     2 public:
     3     int maxSumTwoNoOverlap(vector<int>& A, int L, int M) {
     4         int Lmax=0;//L->M
     5         int Mmax=0;//M->L
     6         //sum[i-j]=presum[j]-presum[i-1]
     7         int res=0;
     8         for(int i=1; i<A.size(); i++){
     9             A[i]+=A[i-1];
    10         }
    11         Lmax=A[L-1];
    12         Mmax=A[M-1];
    13         res=A[M+L-1];
    14         for(int i=L+M; i<A.size(); i++){
    15             Lmax=max(Lmax, A[i-M]-A[i-M-L]);
    16             Mmax=max(Mmax, A[i-L]-A[i-L-M]);
    17             res=max(res, max(Lmax+A[i]-A[i-M], Mmax+A[i]-A[i-L]));
    18         }
    19         return res;
    20     }
    21 };
  • 相关阅读:
    vue-slot插槽
    js中filter函数
    js异步处理
    js变量提升
    js中的4种函数调用模式
    js方法
    Javascript中的闭包 O__O "…
    js实现瀑布流以及加载效果
    2D转换下的zoom和transform:scale的区别
    [转]JavaScript与元素间的抛物线轨迹运动
  • 原文地址:https://www.cnblogs.com/habibah-chang/p/13035995.html
Copyright © 2020-2023  润新知