当前位置: 首页 > article >正文

Leetcode.1191 K 次串联后最大子数组之和

题目链接

Leetcode.1191 K 次串联后最大子数组之和 Rating : 1748

题目描述

给定一个整数数组 arr和一个整数 k,通过重复 k次来修改数组。

例如,如果 arr = [1, 2] , k = 3,那么修改后的数组将是 [1, 2, 1, 2, 1, 2]

返回修改后的数组中的最大的子数组之和。注意,子数组长度可以是 0,在这种情况下它的总和也是 0

由于 结果可能会很大,需要返回的 1 0 9 + 7 10^9 + 7 109+7

示例 1:

输入:arr = [1,2], k = 3
输出:9

示例 2:

输入:arr = [1,-2,1], k = 5
输出:2

示例 3:

输入:arr = [-1,-2], k = 7
输出:0

提示:

  • 1 < = a r r . l e n g t h < = 1 0 5 1 <= arr.length <= 10^5 1<=arr.length<=105
  • 1 < = k < = 1 0 5 1 <= k <= 10^5 1<=k<=105
  • − 1 0 4 < = a r r [ i ] < = 1 0 4 -10^4 <= arr[i] <= 10^4 104<=arr[i]<=104

解法:前缀和 + 贪心

分情况讨论:

  • 当最大子数组 只位于单个数组内 时,此时 最大和 就为单个数组内的最大子数组和。
  • 当最大子数组 横跨两个数组 时,此时 最大和 就为 第一个数组的最大后缀和 + 第二个数组的最大前缀和
  • 当最大子数组 横跨多个数组 时,此时 单个数组的和肯定是大于 0的,此时 最大和 就为 第一个数组的最大后缀和 + (k - 2)个数组的数组和 + 最后一个数组的最大前缀和

如何计算一个数组内的最大子数组和

时间复杂度: O ( n ) O(n) O(n)

C++代码:

const int MOD = 1e9 + 7;
using LL = long long;

class Solution {
public:
    int kConcatenationMaxSum(vector<int>& arr, int k) {
        int n = arr.size();

        //前缀和 最大前缀和 最小前缀和
        LL preSum = 0,maxPreSum = 0, minPreSum = 0;
        //单个数组的最大数组和
        LL ans = 0;

        for(auto x:arr){
            preSum += x;
            minPreSum = min(preSum,minPreSum);
            maxPreSum = max(preSum,maxPreSum);
            ans = max(ans,preSum - minPreSum);
        }

        //后缀和  最大后缀和 
        LL suffixSum = 0 , maxSuffixSum = 0;

        for(int i = n - 1;i >= 0;i--){
            suffixSum += arr[i];
            maxSuffixSum = max(suffixSum,maxSuffixSum);
        }

        //1.单个数组的最大和 即 ans

        //2.两个数组的最大和 即第一个数组的最大后缀和 + 第二个数组的最大前缀和
        if(k >= 2) ans = max(ans,maxPreSum + maxSuffixSum);

        //3.多个数组的最大和 单个数组和 > 0 , 即第一个数组的最大后缀和 + (k-2)个数组的和 + 最后
        //一个数组的最大前缀和
        if(k >= 3 && preSum > 0) ans = max(ans , maxSuffixSum + (k-2)*preSum + maxPreSum);

        return (int)(ans % MOD);
    }
};



http://www.kler.cn/a/4405.html

相关文章:

  • 《银行保险机构数据安全管理办法》正式实施,分类分级、安全评估共筑安全防线
  • Js:正则表达式及正则表达式方法
  • 机器学习06-正则化
  • SpringData-Redis缓存之RedisTemplate
  • 活动预告 | CCF开源发展委员会开源供应链安全技术研讨会(2025第一期)——“大模型时代的开源供应链安全风控技术”...
  • MySQL 排除指定时间内重复记录的解决方案
  • 数据结构之小端和大端之谜
  • Vue 点击图片放大显示功能
  • 11_nginx_document_uri
  • 信息打点-主机架构蜜罐识别WAF识别端口扫描协议识别服务安全
  • 测试开发进阶系列课程
  • 问卷中多选题该怎么分析?
  • 《毫无意义的工作》笔记——一个人的工作越明显对他人有益,他得到的酬劳就越低?
  • STM32之TIM编码器接口
  • uni-app使用uview组件中的封装
  • 【笔记】C# 泛型约束
  • 【华为OD机试 2023最新 】 回文字符串(C++)
  • 基于springboot实现校园在线拍卖电商系统【源码】
  • 小波阈值去躁
  • 除了四大“门派”菌,一文了解肠道菌群的其它17个小众“门派”细菌
  • Java 线程调度
  • C语言的灵魂---指针(进阶)
  • 两数之和(力扣刷题)
  • OpenFeign调用微服务使用RequestInterceptor或@RequestHeader传递http请求头信息
  • Docker安装Redis集群(主从复制)
  • 【id:134】【20分】B. 求最大值最小值(引用)