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

LintCode第42题-最大子数组 II

描述

给定一个整数数组,找出两个 不重叠 子数组使得它们的和最大。
每个子数组的数字在数组中的位置应该是连续的。
返回最大的和

子数组最少包含一个数

样例 1:

输入:

nums = [1, 3, -1, 2, -1, 2]

输出:

7

解释:

最大的子数组为 [1, 3] 和 [2, -1, 2] 或者 [1, 3, -1, 2] 和 [2].
样例 2:

输入:

nums = [5,4]

输出:

9

解释:

最大的子数组为 [5] 和 [4].

挑战 

要求时间复杂度为 O(n)

思路:

主要分为两种解题方法 

第一种:动态累加和 + 最大子数组和

第二种:前缀和快速计算 左侧最大子数组和 和 右侧最大子数组和,从而找到两个不重叠子数组的最大和

但前缀和有一个点 可以快速计算区间和

下面是第一种解法:

代码如下:

public class Solution {

    /**

     * @param nums: A list of integers

     * @return: An integer denotes the sum of max two non-overlapping subarrays

     */

    public int maxTwoSubArrays(List<Integer> nums) {

        int[] numArray = nums.stream().mapToInt(Integer::intValue).toArray();

        int n = numArray.length;

        // 左侧最大子数组和

        int[] leftMax = new int[n];

        int currentSum = 0, maxSum = Integer.MIN_VALUE;

        for (int i = 0; i < n; i++) {

            currentSum = (currentSum > 0 ? currentSum : 0) + numArray[i];//如果是负值将其变为0

            maxSum = Math.max(maxSum, currentSum);

            leftMax[i] = maxSum;

        }

        // 右侧最大子数组和

        int[] rightMax = new int[n];

        currentSum = 0;

        maxSum = Integer.MIN_VALUE;

        for (int i = n - 1; i >= 0; i--) {

            currentSum = (currentSum > 0 ? currentSum : 0) + numArray[i];

            maxSum = Math.max(maxSum, currentSum);

            rightMax[i] = maxSum;

        }

        // 计算最大不重叠子数组和

        int finalResultSum = Integer.MIN_VALUE;

        //依次遍历两个左子数组和右子数组 得到其组合的最大值即为最大的返回值

        for (int i = 0; i < n - 1; i++) {

            finalResultSum = Math.max(finalResultSum, leftMax[i] + rightMax[i + 1]);

        }

        return finalResultSum;

    }

}

http://www.xdnf.cn/news/405595.html

相关文章:

  • 《Vuejs设计与实现》第 5 章(非原始值响应式方案) 中
  • OpenCV 的 CUDA 模块中用于将一个多通道 GpuMat 图像拆分成多个单通道图像的函数split()
  • 【AI News | 20250512】每日AI进展
  • 一键生成达梦、Oracle、MySQL 数据库 ER 图!解锁高效数据库设计!
  • 【LeetCode】49.字母异位词分组
  • 典籍知识问答重新生成和消息修改Bug修改
  • 从零搭建AI工作站:Gemma3大模型本地部署+WebUI配置全套方案
  • sqlmap使用入门
  • Linux 系统中设置开机启动脚本
  • AAAI-2025 | 中科院无人机导航新突破!FELA:基于细粒度对齐的无人机视觉对话导航
  • 【JAVA】业务系统订单号,流水号生成规则工具类
  • python练习-20250512
  • C++23 views::slide (P2442R1) 深入解析
  • AnaTraf:深度解析网络性能分析(NPM)
  • C语言:深入理解指针(3)
  • 基于 Nexus 在 Dockerfile 配置 yum, conda, pip 仓库的方法和参考
  • T2000云腾边缘计算盒子在数猪场景中的应用|YOLOv8+NodeRED
  • 湖北理元理律师事务所:企业债务危机的“止血”与“造血”平衡术
  • 01背包和完全背包
  • 基于Qt6 + MuPDF在 Arm IMX6ULL运行的PDF浏览器——MuPDF Tools
  • 大项目k8s集群有多大规模,多少节点,有多少pod
  • 智能指针入门:深入理解 C++ 的 shared_ptr
  • AI中的MCP是什么?MCP的作用及未来方向预测 (使用go-zero 快速搭建MCP服务器)
  • 2025年北京市积分落户申报
  • 经典案例 | 智能眼镜中瞳距调节和近视调节的应用
  • web 自动化之 Unittest 四大组件
  • 【NextPilot日志移植】ULog
  • 文档外发安全:企业数据防护的最后一道防线
  • RabbitMQ 工作模式
  • JWT的介绍与在Fastapi框架中的应用