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

多维数组与矩阵之子数组的最大累加和

问题描述

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

算法思路

注:首先解释一下什么是子数组?即一段连续的数组的切片

解法一:暴力破解O(n^2)

双重for循环,计算每个子数组的累加和,记录其中最大的累加和。

public class _05_子数组的最大的和 {
    public static void main(String[] args) {
        int[] arr = {1,-2,3,5,-2,6,-1};
        findByForce(arr);
    }
    //暴力破解法 O(n^2)
    static void findByForce(int[] arr) {
        int maxSum = arr[0];

        for (int i = 0;i < arr.length;i++) {
            int sum = arr[i];
            int maxOfI = sum;
            for (int j = i+1;j < arr.length;j++) {
                sum += arr[j];
                if (sum > maxOfI) {
                    maxOfI = sum;
                }
            }
            if (maxOfI > maxSum) {
                maxSum = maxOfI;
            }
        }
        System.out.println(maxSum);
    }
}

程序的运行结果:12

解法二:递推法O(n)

负数舍弃,正数保留
从左到右一遍遍历,顺序累加,只要累加和小于0就直接舍弃左边的,从下一个开始重新累加,不断更新更大的非负的累加和。

public class _05_连续子数组的最大的和 {
    public static void main(String[] args) {
        int[] arr = {1,-2,3,5,-2,6,-1};
        findByDp(arr);
    }
    //递推法 O(n)
    static void findByDp(int[] arr) {
        int sumI = arr[0];
        int maxSum = sumI;
        for (int i=1;i < arr.length;i++) {
            if (sumI >= 0) {//左子表的最大和为正,继续向后累加
                sumI += arr[i];
            } else {//左子表的最大和为负,丢弃左边的,定义右边的第一个为最大和,继续向后加
                sumI = arr[i];
            }
            if (sumI > maxSum) {
                maxSum = sumI;
            }
        }
        System.out.println(maxSum);
    }
}

程序的运行结果:12

相关文章:

  • 游戏也是软件,J2ME游戏程序员不能忘本
  • 多维数组与矩阵之子矩阵的最大累加和
  • 本周技术关注:Oracle10G、MSSQL2005、MYSQL5: CLuster、Replication、Snapshot
  • 设计模式之解释器模式详解(Interpreter Pattern)
  • 书评--信息经营法则
  • Java最大公约数与最小公倍数
  • 关于SWT drawLine bug的进一步验证
  • 矩阵乘法
  • IT出版人的Blog世界
  • 关于Java数组,你该了解这些
  • 世界上最难攀登的山其实是自己!
  • 判断一个整数是否为素数
  • Java保留2位小数的方法总结
  • 开发基于Web Service的图片验证码服务
  • String、StringBuffer、StringBuilder区别
  • __proto__ 和 prototype的关系
  • 345-反转字符串中的元音字母
  • Asm.js的简单介绍
  • CEF与代理
  • egg(89)--egg之redis的发布和订阅
  • Java到底能干嘛?
  • Kibana配置logstash,报表一体化
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • Protobuf3语言指南
  • Vim Clutch | 面向脚踏板编程……
  • vue总结
  • 源码安装memcached和php memcache扩展
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • Python 之网络式编程
  • 大数据全解:定义、价值及挑战
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • #android不同版本废弃api,新api。
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (Python) SOAP Web Service (HTTP POST)
  • (SpringBoot)第七章:SpringBoot日志文件
  • (第61天)多租户架构(CDB/PDB)
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .NET Core 成都线下面基会拉开序幕
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .NET 设计一套高性能的弱事件机制
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .vimrc php,修改home目录下的.vimrc文件,vim配置php高亮显示
  • [ C++ ] STL---string类的使用指南
  • [ CTF ] WriteUp-2022年春秋杯网络安全联赛-冬季赛
  • [1159]adb判断手机屏幕状态并点亮屏幕
  • [3300万人的聊天室] 作为产品的上游公司该如何?
  • [Android]使用Git将项目提交到GitHub
  • [BZOJ4566][HAOI2016]找相同字符(SAM)
  • [C++] new和delete
  • [CSS] - 修正IE6不支持position:fixed的bug
  • [emuch.net]MatrixComputations(7-12)