最大子数组累加和(2种方法)
题目:最大子数组累加和
给定一个数组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种方法)相关推荐
- php 去重_php求两数组交集的四种方法详解
题目:给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入: nums1 = [1,2,2,1],nums2 = [2,2] 输出: [2] 示例 2: 输入: nums1 = [4,9,5 ...
- 在php中可以使用几种方法定义数组,PHP中数组定义的几种方法
在php.html" target="_blank">php和其他编程语言中,需要常常使用数组创建,我们在前端开发中,js的数组创建可以由new array创建,下 ...
- 【转】C#中数组复制的4种方法
C#中数组复制的4种方法 from:http://blog.csdn.net/burningcpu/article/details/1434167 今天旁边的同事MM叫我调了一段程序,她想复制一个数组 ...
- c语言数组最大可定义多少位_C语言求数组的最大值三种方法
/* 黄哥Python培训 黄哥所写*/#include int maxValue(int* arr, int n);int maxRecursionValue(int* arr, int n);in ...
- java 数组效率_java数组复制的四种方法效率对比
有关数组的基础知识,有很多方面,比方说初始化,引用,遍历,以及一维数组和二维数组,今天我们先看看数组复制的有关内容. 来源于牛客网的一道选择题: JAVA语言的下面几种数组复制方法中,哪个效率最高? ...
- java hashmap 去重_java数组去重的两种方法
我们对于数组元素的使用,有时候在创建数组的初期,并没有考虑过元素的重复问题.当我们想要不重复元素的数组时,就要再进行一步去重的工作.数组的去重有两种方法可以实现,一个是循环比较,另一个是hashSet ...
- C语言中调用数组元素的三种方法:下标法、数组名法、指针法
/*调用数组元素的三种方法:下标法.数组名法.指针法*/ #include<stdio.h> int main() {int a[] = { 1,2,3,4,5 }, i, * p;pri ...
- 两个对象数组去重的3种方法
两个对象数组去重的3种方法 前言 问题描述 解决方案一 解决方案二 解决方案三 前言 前段时间写过JavaScript数组去重最简单的 4 种方案,里面的数组元素是基本类型.本文要讲的数组元素是对象, ...
- JavaScript 数组遍历的五种方法(转)
转自:JavaScript 数组遍历的五种方法 这篇文章主要介绍了JavaScript 数组遍历的五种方法,帮助大家更好的理解和学习使用JavaScript,感兴趣的朋友可以了解下 在使用 JavaS ...
最新文章
- Python 笔试面试及常用技巧 (1)
- 用鞋子给视障人士导航!这款“导盲鞋”可检测4米外障碍物,振动提醒躲避,一双2w5...
- Synergy 共享键盘和鼠标
- python都可以干什么-python都可以做什么用
- .jQuery文档分析4-文档处理
- CLR_via_C#.3rd 翻译[1.5 本地代码生成工具NGen.exe]
- Ado.net类与对象
- 特岗计算机老师年度总结,特岗教师个人年度工作总结
- 基于hadoop的商品推荐系统_【论文笔记】基于矩阵分解的推荐系统
- php中计算时间差的几种方法,PHP 中计算时间差的几种方法
- ajax,training my javascript!手写AJAX,用POST方法传值
- aws 部署python lambda_awslambda-为Lambda工具部署Python项目。-Philipp Gorczak Getting started Usage...
- virtualenv 安装及使用[转]
- 【脑电信号】基于matlab小波变换DWT脑电信号ECG去噪【含Matlab源码 1622期】
- Flash倒计时+写在自定义类+写在关键帧
- win10安装VS2015
- 打造个人专属邮箱,域名邮箱,邮件系统
- 文件读写处理:古诗问题
- python将数值存入excel指定单元格
- linux基础知识复习学习笔记
热门文章
- 自主品牌语音交互性能测评,荣威RX5反应更快,博越变暖男
- 语音支持英语_语音识别英语_英语语音评分 - 云+社区 - 腾讯云
- SIMIS计算机联锁系统,steam游戏sim
- python安全性_关于python安全性的问题
- python基本判断语句_python两种简洁的条件判断语句写法
- 【狂神Mybatis笔记】配置解析
- 【动态规划刷题笔记】线性dp:合唱队形(最长递增子序列的变体)
- 蓝桥杯笔记:带分数(dfs排列问题)
- DotCMS安装步骤
- dd linux 格式化u盘启动盘_Ubuntu to go启动盘制作