LeetCode-1191.K次串联后的最大子数组

题目:
在这里插入图片描述
代码:

class Solution {
public:
    int kConcatenationMaxSum(vector<int>& arr, int k) {
        int mod=1e9+7,n=arr.size();
        int qz=0,hz=0,zj=0;
        int temp1=0,temp2=0;
        int qzmin=0;
        int sum=0;
        for(int i=0;i<arr.size();i++){
            sum+=arr[i];
            if(qzmin>sum) qzmin=sum;
            else{
                zj=max(zj,sum-qzmin);
            }
            temp1+=arr[i];
            if(temp1>qz) qz=temp1;
            temp2+=arr[n-1-i];
            if(temp2>hz) hz=temp2;
        }
        if(k==1) return zj;
        if(sum<=0){
            return max(zj,qz+hz);
        }
        long int a=1;
        a*=(k-2);
        a*=sum;
        a=a%mod;
        return max(zj,(qz+hz+(int)a)%mod);
    }
};

思路:
1.先求出最大前缀qz,最大后缀hz,以及最大子数组zj,整个数组的和sum
2.分三种情况:
一、k=1,则应为原数组的最大子数组
二、k>=2,sum<=0,则应为max(zj,qz+hz),即最多只能包含两个数组
三、k>=2,sum>0,则应为max(zj,qz+hz+(k-2)*sum),即要么是原数组的最大子数组,要么是第一个数组的最大后缀加中间所有数组加最后一个数组的盾最大前缀。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值