第四章:多维数组和矩阵 ------------- 4.7 子数组最大累加和

Kadane算法解析:从暴力到动态规划的最大子数组和优化 最大子数组和问题是算法领域的经典案例,常用于金融数据分析、信号处理等场景。该问题要求找出数组中连续子序列的最大和,其核心解法经历了从O(n³)暴力枚举到O(n)动态规划的演进过程。Kadane算法作为最优解,通过动态规划思想将问题分解为局部最优子问题,仅需一次遍历即可得到全局最优解。在实际工程中,该算法广泛应用于股票收益分析、DNA序列匹配等大数据场景,其O(1)的空间复杂度尤其适合处理海量数据。理解该算法的状态转移方程(dp[i]=max(nums[i],dp[i-1]+nums[i]))是掌握动态规划思 阅读详情

 题目:

       给定一个数组arr,返回子数组的最大累加和。例如arr = {1,-2,3,5,-2,6,-1};所有的子数组中[3,5,-2,6]可以累加出最大的和12,所以返回12。

代码: 

import java.util.Arrays;
import java.util.Date;

/**
 * 求和最大的连续子数组,有可能不唯一,返回一个即可
 */
public class MaxSubArray {

    // 暴力破解法 O(N²)
    static void findByForce(int []arr){
        int maxSum = arr[0];
        for (int j = 0; j < arr.length; j++) {
            int sum = arr[j]; // 某个元素为子数组的第一个元素
            int maxOfJ = sum;
            
            for (int i = j+1; i < arr.length; i++) {
                sum += arr[i]; // 累加后续元素
                if (sum>maxOfJ) {
                    maxOfJ = sum;
                }
            }
            if (maxOfJ>maxSum) {
                maxSum = maxOfJ;
            }
        }
        System.out.println(maxSum);
    }
    
    // 递推法 O(N)
    static int findByDp(int []arr){
        if (arr.length==0) {
            return 0;
        }
        int sumJ = arr[0];  // 前J个元素的最大贡献
        int max = sumJ;
//        int left = 0,right = 0;  // 最大子数组的左右边界下标
        for (int j = 1; j < arr.length; j++) {
            if (sumJ >= 0) { // 左子表的最大和为正,继续向后累加
                sumJ += arr[j];
            } else {
                sumJ = arr[j];
//                left = j;// 丢弃前部分和的同时,更新left
            }

            if (sumJ > max) {
                max = sumJ;
//                right = j;// 更新max的同时更新right
            }
        }
        // System.out.println(max+",left="+left+",right:"+right);
        return max;
    }
    /**
     * 获取指定范围指定个数的随机数组成的数组
     */
    public static int[] getRandomArr(int length, int min, int max) {
        int[] arr = new int[length];
        for (int i = 0; i < length; i++) {
          arr[i] = (int) (Math.random() * (max + 1 - min) + min);
        }
        return arr;
      }
    public static void main(String[] args) {
//        int []arr = new int[]{1,-2,3,5,-2,6,-1};
        int[] arr = getRandomArr(10000, -100, 100);
        System.out.println("数组:" + Arrays.toString(arr));
//        long now = new Date().getTime();
//        findByForce(arr);
//        long next1 = new Date().getTime();
//        System.out.println("暴力法,时间消耗:" + (next1 - now));
        
        long now = System.currentTimeMillis();
        findByForce(arr);
        long next1 = System.currentTimeMillis();
        System.out.println("暴力法,时间消耗:" + (next1 - now));

        System.out.println(findByDp(arr));
        long next2 = System.currentTimeMillis();
        System.out.println("递推法,时间消耗:" + (next2 - next1));
    }

}

结果:

注意:上面的代码没有考虑数组全为负数的情况,如果数组全为负数的话,返回数组的最大值即可。

来源:https://www.cnblogs.com/xiaoyh/p/10295107.html 

最大子数组和问题:Kadane算法详解与应用 最大子数组和问题是算法领域的经典问题,涉及在给定数组中寻找连续子数组的最大和。其核心原理基于动态规划思想,通过Kadane算法实现O(n)时间复杂度的优化解。该算法在工程实践中具有重要价值,广泛应用于股票交易分析、信号处理、计算机视觉等领域。作为LeetCode高频面试题,掌握Kadane算法不仅能提升算法能力,还能解决实际业务场景中的连续区间极值问题。本文通过对比暴力解法与Kadane算法的性能差异,深入解析动态规划在最优子结构问题中的应用技巧。 阅读详情

相关推荐

从零到一:鲲鹏920服务器上的DeepSeek模型部署全流程解析

本文详细解析了在华为鲲鹏920服务器上部署DeepSeek模型的全流程,包括环境准备、模型服务框架部署、性能优化及生产环境方案。通过ARM架构优化和量化技术,显著提升模型推理效率,适用于企业级AI应用场景,助力国产化技术落地。

weixin_29094775的博客 599

给定一个数组,返回最大子数组的累加和并且返回该子数组

给定一个数组Arr,返回子数组的最大累加和 例如 arr[] = {1,-2,3,5,-2,6,-1};所有子数组中,[3,5,-2,6] 可以累加出最大和12 函数在设计的时候,应该考虑传入的数组Arr,同时要有一个传出数组,返回值会最大累加和,为整数 以下是代码 #include #include int maxSum(int arr[], int n,ve

GuFanYuan的专栏 1328

树莓派4B学习笔记一

树莓派4b烧录Ubuntu20.04&&配置Ubuntu桌面

m0_55202222的博客 3643

【算法】子数组的最大累加和/子矩阵的最大累加和问题

题一:子数组的最大累加和 给定一个数组arr,返回子数组的最大累加和 例如:arr=[1,-2,3,5,-2,6,-1], 所有的子数组中[3,5,-2,6]可以累加出最大的和12,所以返回12. 【要求】arr的长度为N,时间复杂度为O(N),额外空间复杂度为O(1) 【思路】用变量记录cur记录每一步的累加和,遍历到正数cur增加,遍历到负数cur减少。 当cur 作为产生最大

duxinyuhi的专栏 1811

【自然语言处理(NLP)实战】LSTM网络实现中文文本情感分析(手把手与教学超详细)

在当今数字化时代,人们在社交媒体、评论平台以及各类在线交流中产生了海量的文本数据。这些数据蕴含着丰富的情感信息,从而成为了深入理解用户态度、市场趋势,甚至社会情绪的宝贵资源。自然语言处理(NLP)的发展为我们提供了强大的工具,使得对文本情感进行分析成为可能。在这个领域中,长短时记忆网络(LSTM)凭借其能够捕捉文本序列中长距离依赖关系的能力,成为了情感分析任务中的一项重要技术。通过详细的步骤和示例代码,深入了解如何处理中文文本数据、构建LSTM模型、进行训练和评估。

halo的博客 2万+

保姆级教程:用Cesium的Primitive API实现火箭发射全流程动画(含代码避坑)

本文详细介绍了如何使用Cesium的Primitive API实现火箭发射全流程动画,包括模型控制、关节动画和精细时序管理。通过实战代码示例和性能优化技巧,帮助开发者高效构建高复杂度航天仿真系统,显著提升三维可视化效果与运行效率。

weixin_42565652的博客 214

子数组的最大累加和问题

题目描述 给定一个数组arr,返回子数组的最大累加和 例如,arr = [1, -2, 3, 5, -2, 6, -1],所有子数组中,[3, 5, -2, 6]可以累加出最大的和12,所以返回12. [要求] 时间复杂度为O(n)O(n),空间复杂度为O(1)O(1) 示例 输入 [1, -2, 3, 5, -2, 6, -1] 输出 12 思路描述 动态规划,拆成小问题来解决,同时考虑数组为空,以及数组为1个元素的情况,大部分情况用来判定当前位置元素和前一位置元素相加会不会比当前位置元素大的情况,若大,

qq_44790423的博客 299

华为HCIA-Datacom实战:200人企业园区网从规划到部署全流程解析

本文详细解析了华为HCIA-Datacom认证实战中200人企业园区网的规划与部署全流程。从需求分析、组网架构设计到设备选型、VLAN划分及安全策略实施,全面覆盖园区网建设的关键环节,特别针对部门隔离、无线覆盖和基础安全防护等典型场景提供可落地的解决方案。

f0g1h2的博客 712

动态规划最简单的例子:给定一个数组arr,返回子数组的最大累加和

时间限制:C/C++ 2秒,其他语言4秒空间限制:C/C++ 256M,其他语言512M热度指数:12814 本题知识点:分治动态规划 算法知识视频讲解 题目描述 给定一个数组arr,返回子数组的最大累加和 例如,arr = [1, -2, 3, 5, -2, 6, -1],所有子数组中,[3, 5, -2, 6]可以累加出最大的和12,所以返回12. [要求] 时间复杂度为O(n)O(n),空间复杂度为O(1)O(1) 示例1 输入 复制 [1, -2, 3, 5,...

weixin_41579872的博客 753

ThingsBoard 仪表板状态

请先通过阅读仪表板概述和仪表板入门案例来熟悉ThingsBoard的仪表板。文章希望通过浅显的文字描述什么是仪表板状态及如何使用。 概念 状态功能使得仪表板可以分层,配合小部件的动作,实现多层仪表板之间的跳转.每个状态对应一个仪表板的图层 每个仪表板有一个默认的根状态, 根状态可以理解为默认状态, 也就是打开仪表板默认展示的仪表板图层.编辑模式下, 点击右上角的图标来管理状态.添加多个状态后左上角出现状态切换(图层切换)下拉列表可以通过选中根状态复选框切换新的默认展示的状态/图层配合小部件的动作,实现状

物联网三分钟 2309

【重要内容】敬告读者

由于优快云近期将要搞事情,此专栏建议已购买的用户将内容保存到本地。尚未购买的用户请待9月1日后再决定是否需要购买。如此规则上线,本人将会关闭此专栏。并寻找其他渠道进行发布。

魔落的博客 910

算法很美 笔记 4.多维数组与矩阵

4.多维数组与矩阵 题1 :顺时针打印二维数组 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。 示例 1: 输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5] 示例 2: 输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]] 输出:[1,2,3,4,8,12,11,10,9...

xcsxchen 997

Agile Modbus使用和学习笔记

i < len;这里仅仅需要提供获取函数即可,离散输入是只读类型i++) {return 0;只读类型寄存器i++) {return 0;i < len;

Car12 169

【算法很美】多维数组与矩阵

多维数组与矩阵1. 多维数组基础题● 顺时针打印二维数组● 零所在行列清零● Z字型打印矩阵2. 复杂解● 边界为1的最大字方阵● 编程返回子数组最大累加和● 求子矩阵最大累加和● 矩阵运算一、矩阵的加法与减法二、矩阵与数的乘法三、矩阵与矩阵的乘法 1. 多维数组基础题 ● 顺时针打印二维数组 一圈一圈的打印,每圈以 每圈左上角坐标和右下角坐标 为边界。 public static void print(int[][] matrix) { int leftUpRow = 0, leftUpCo

weixin_48434658的博客 724

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

JavaScript算法探秘:寻找最大子数组的和

通过这次深入探索,我们不仅掌握了寻找最大子数组和的多种解法,更深刻理解了算法设计中的权衡与优化。在你的编码旅途中,是否遇到过类似算法挑战?或是有独到的解题思路?欢迎在评论区分享你的故事,让我们一起在算法的海洋中航行,探索更多的未知与精彩。欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。DTcode7的博客首页。一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身农奴把歌唱,

一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身"农奴"把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟! 877

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

多维数组和矩阵----子数组最大累加和

题目:   给定一个数组arr,返回子数组的最大累加和。例如arr = {1,-2,3,5,-2,6,-1};所有的子数组中[3,5,-2,6]可以累加出最大的和12,所以返回12。 代码: 1 import java.util.Arrays; 2 import java.util.Date; 3 4 /** 5 * 求和最大的连续子数组,有可能不唯一,返回一个即可...

weixin_30381317的博客 213

[算法系列] 多维数组--超详细解答!!记几道经典的多维数组习题(顺时针打印矩阵,z字型打印矩阵等)

[算法系列] 多维数组–记几道经典的多维数组习题 1. 顺时针打印二维数组 传入一个二维数组 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 顺时针打印出: 1 2 3 4 8 12 16 15 14 13 9 5 6 7 8 12 11 10 分析: 有如下二维数组, 那么它具体打印顺序是像右面这样的: 按照 1…5...

lawfree的博客 3388

多维数组和矩阵程序练习

顺时针打印二维数组: 题目: 顺时针打印二维数组。 例如:将如下数组: {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 16}} 输出为:1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10 思路: 可以先一圈一圈的打印。先打印外圈,再缩小边界范围循环打印内圈即可。打印的时候注意控制边界。 代码...

曹世宏的博客 825

多维数组和矩阵----子矩阵最大累加和

题目:给定一个矩阵matrix,其中的值有正、有负、有0,返回子矩阵的最大累加和。 例如,matrix为: -1 -1 -1 -1 2 2 -1 -1 -1 其中最大累加的子矩阵为:2 2,所以返回 4 思路: 解法一:暴力破解,查找出所有的子矩阵,时间复杂度太高了,不可取。 解法二:假定只有一行,那就跟求最大和子数组一样。 如果限...

weixin_30608503的博客 140

第四章 多维数组与矩阵

1、顺时针打印二维数组 package org.lanqiao.algo.elementary._04matrix; /** * 顺时针打印二维数组 输入 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 输出 1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10 */ public class Case...

h_666666的博客 377

多维数组与矩阵

【问题描述】给定一个数组arr ,返回子数组的最大累加和,例: arr=[1,-2,3,5,-2,6,-1]所有的子数组中[3,5,-2,6]可以累加出最大的和12 ,所以返回12。【优化】预处理,复制一份空的与原矩阵阶数相同的矩阵,记录其右和下(包含他自己的1的个数),只检测4个数就行,三维数组。【问题描述】给定一个NxN的矩阵matrix,在这个矩阵中,只有0和1两种值,返回边框全是1的最大正方形的边长长度。【问题描述】给定一个矩阵matrix ,其中的值有正、有负、有0 ,返回子矩阵的最大累加和。

Xpy_021101的博客 202

第四章:多维数组和矩阵 ------------- 4.8 子矩阵的最大累加和

题目: 给定一个矩阵matrix,其中的值有正、有负、有0,返回子矩阵的最大累加和。 例如,matrix为: -1 -1 -1 -1 2 2 -1 -1 -1 其中最大累加的子矩阵为:2 2,所以返回 4 思路: 解法一:暴力破解,查找出所有的子矩阵,时间复杂度太高了,不可取。 解法二:假定只有一行,那就跟求最大和子数组一样。 如果限...

Curtis’Blog 273

蓝桥杯算法课《算法最美》笔记——4.多维数组和矩阵

4. 多维数组基础题 4.1 顺时针打印二维数组 题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。 [1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16] 打印1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10 思路:一圈一圈的打印。 import java.util.ArrayList; import java.util.Arrays; public class 顺时针打印2维数组 { public static void m

m0_55846001的博客 316

js多维数组的获取与渲染

一、多维数组 数组是具有相同数据类型且按一定次序排列的一组变量的集合体。构成一个数组的所有变量称为数组元素,数组的名字称为数组名,每一个数组元素由数组名及其在数组中的位置(下标)确定。数组按下标个数分为:一维数组,二维数组和三维数组等,二维及以上数组统称为多维数组 在数组名后有两对方括号的数组被称为二维数组,同理,数组名后有n对方括号的数组被称为n维数组,二维及以上的数组被称为多维

Lucky_LXG的博客 8843

滴滴面试题解析:数组划分最小化最大子数组和

数组划分是算法面试中的经典问题,涉及将数组分割为连续子数组并优化特定目标。这类问题通常采用二分查找与贪心算法结合的解法,时间复杂度可达O(n logS)。在实际工程中,类似技术广泛应用于数据分片、负载均衡等分布式场景。以滴滴面试题为例,给定数组和划分数量k,寻找使最大子数组和最小的划分方案。通过确定搜索范围、二分验证和贪心策略,能高效解决这类资源分配问题。掌握这种解题思路不仅有助于面试,对处理分布式计算、数据库分片等实际问题也很有价值。

weixin_34242509的博客 880

【SSL 1056】最大子矩阵 (多维DP)

已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是1∗1)子矩阵。比如,如下4∗4子矩阵的最大子矩阵是9 2-4 1-1 8这个子矩阵的大小是15。输入一个N∗N1<=N<=500的整数矩阵,每个数的范围在−127127之间。输出最大子矩阵的大小。15。

m0_73647951的博客 588
上一篇: 第四章:多维数组和矩阵 ------------- 4.4 找出边界为1的最大子方阵
下一篇: 第四章:多维数组和矩阵 ------------- 4.8 子矩阵的最大累加和
Estrellas_
博客等级 码龄9年 273粉丝 233原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值