题目:最大子数组累加和
给定一个数组arr=[1,-2,3,5,-2,6,-1];所有的子数组中[3,5,-2,6]可以累加出最大的和12,所以返回12
什么是子数组,子数组就是在原数组中连续的一段数组序列,必须是连续的。
例如:长度为7的子数组有1个,即数组本身。
长度为6的子数组有2个,[1,-2,3,5,-2,6];[-2,3,5,-2,6,-1].
长度为5的子数组有3个,[1,-2,3,5,-2];[-2,3,5,-2,6];[5,-2,6,-1]
长度为4的子数组有4个,以此类推…
所以可能存在子数组的个数有N^2(N*(N+1)/2)


分析思路:要求出最大子数组累计和,
把所有可能的子数组找出来,将它们累加算一下和,就可以找出最大子数组累加和

  • 方法一:暴力解法 0(n^2)

以每一个元素为开头,为子数组的第一个元素

  • 方法二:递推法 0(n)

利用指针,单向扫描累加,从第一个开始,若为累加和为正数就继续累加,若累加和为负数就丢弃它(此处丢弃的并不是单个的元素,而是从前到后累加和为负数丢弃它),以下一个元素为开头,重复上面的步骤。
把每一个求和要和max做比较,保留目前最大的继续加,若后面累加的几个元素出现比max小的,则不成立,仍保持前面累加最大的和。


  • 方法一:

暴力解法 代码

package maxsubarry;public class Maxsubarry {static void findByForce(int[] arr) {int maxsum=arr[0]; //最大子数组和for(int j=0;j<arr.length;j++) { //j为数组第一个元素int sum=arr[j];//某个元素为子数组的第一个元素int maxof=sum;for(int i=j+1;i<arr.length;i++) { //元素依次向后累加sum+=arr[i]; //累加后续元素if(sum>maxof) {maxof=sum; //不断更新最大累加和}}if(sum<maxof) {maxsum=maxof;}}System.out.println(maxsum);}
}
  • 方法二:

递推法 代码

package maxsubarry;public class Maxsubarrynew {static void findByForce(int[] arr) {int sum=arr[0]; //前j个元素累加和int max=sum;int left=0,right=0;  //两个指针,left单向扫描,right指向本子数组最后一个元素for(int j=1;j<arr.length;j++) {if(sum>0) {  //左子表最大和为正,继续向后累加sum+=arr[j];}else {  //和为负,丢弃sum=arr[j];left=j;  //丢弃前部分和的同时,更新left}if(sum>max) {max=sum;right=j; //更新max的同时更新right}}System.out.println(max+",left="+",right:"+right);System.out.println(max);}
}

最大子数组累加和(2种方法)相关推荐

  1. php 去重_php求两数组交集的四种方法详解

    题目:给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入: nums1 = [1,2,2,1],nums2 = [2,2] 输出: [2] 示例 2: 输入: nums1 = [4,9,5 ...

  2. 在php中可以使用几种方法定义数组,PHP中数组定义的几种方法

    在php.html" target="_blank">php和其他编程语言中,需要常常使用数组创建,我们在前端开发中,js的数组创建可以由new array创建,下 ...

  3. 【转】C#中数组复制的4种方法

    C#中数组复制的4种方法 from:http://blog.csdn.net/burningcpu/article/details/1434167 今天旁边的同事MM叫我调了一段程序,她想复制一个数组 ...

  4. c语言数组最大可定义多少位_C语言求数组的最大值三种方法

    /* 黄哥Python培训 黄哥所写*/#include int maxValue(int* arr, int n);int maxRecursionValue(int* arr, int n);in ...

  5. java 数组效率_java数组复制的四种方法效率对比

    有关数组的基础知识,有很多方面,比方说初始化,引用,遍历,以及一维数组和二维数组,今天我们先看看数组复制的有关内容. 来源于牛客网的一道选择题: JAVA语言的下面几种数组复制方法中,哪个效率最高? ...

  6. java hashmap 去重_java数组去重的两种方法

    我们对于数组元素的使用,有时候在创建数组的初期,并没有考虑过元素的重复问题.当我们想要不重复元素的数组时,就要再进行一步去重的工作.数组的去重有两种方法可以实现,一个是循环比较,另一个是hashSet ...

  7. C语言中调用数组元素的三种方法:下标法、数组名法、指针法

    /*调用数组元素的三种方法:下标法.数组名法.指针法*/ #include<stdio.h> int main() {int a[] = { 1,2,3,4,5 }, i, * p;pri ...

  8. 两个对象数组去重的3种方法

    两个对象数组去重的3种方法 前言 问题描述 解决方案一 解决方案二 解决方案三 前言 前段时间写过JavaScript数组去重最简单的 4 种方案,里面的数组元素是基本类型.本文要讲的数组元素是对象, ...

  9. JavaScript 数组遍历的五种方法(转)

    转自:JavaScript 数组遍历的五种方法 这篇文章主要介绍了JavaScript 数组遍历的五种方法,帮助大家更好的理解和学习使用JavaScript,感兴趣的朋友可以了解下 在使用 JavaS ...

最新文章

  1. Python 笔试面试及常用技巧 (1)
  2. 用鞋子给视障人士导航!这款“导盲鞋”可检测4米外障碍物,振动提醒躲避,一双2w5...
  3. Synergy 共享键盘和鼠标
  4. python都可以干什么-python都可以做什么用
  5. .jQuery文档分析4-文档处理
  6. CLR_via_C#.3rd 翻译[1.5 本地代码生成工具NGen.exe]
  7. Ado.net类与对象
  8. 特岗计算机老师年度总结,特岗教师个人年度工作总结
  9. 基于hadoop的商品推荐系统_【论文笔记】基于矩阵分解的推荐系统
  10. php中计算时间差的几种方法,PHP 中计算时间差的几种方法
  11. ajax,training my javascript!手写AJAX,用POST方法传值
  12. aws 部署python lambda_awslambda-为Lambda工具部署Python项目。-Philipp Gorczak Getting started Usage...
  13. virtualenv 安装及使用[转]
  14. 【脑电信号】基于matlab小波变换DWT脑电信号ECG去噪【含Matlab源码 1622期】
  15. Flash倒计时+写在自定义类+写在关键帧
  16. win10安装VS2015
  17. 打造个人专属邮箱,域名邮箱,邮件系统
  18. 文件读写处理:古诗问题
  19. python将数值存入excel指定单元格
  20. linux基础知识复习学习笔记

热门文章

  1. 自主品牌语音交互性能测评,荣威RX5反应更快,博越变暖男
  2. 语音支持英语_语音识别英语_英语语音评分 - 云+社区 - 腾讯云
  3. SIMIS计算机联锁系统,steam游戏sim
  4. python安全性_关于python安全性的问题
  5. python基本判断语句_python两种简洁的条件判断语句写法
  6. 【狂神Mybatis笔记】配置解析
  7. 【动态规划刷题笔记】线性dp:合唱队形(最长递增子序列的变体)
  8. 蓝桥杯笔记:带分数(dfs排列问题)
  9. DotCMS安装步骤
  10. dd linux 格式化u盘启动盘_Ubuntu to go启动盘制作