求最大子数组分析

第一种:

暴力枚举所有的子数组,然后比较选出最大,时间复杂度O(n^2)

第二种:

分治法,参见算法导论,时间复杂度O(nlogn)

第三种:

动态规划,时间复杂度O(n)

1、A[1..j+1]的最大子数组为:max{A[1..j] , A[i,j+1](1<=i<=j+1)最大值},用sum记录A[1..j]

2、A[i,j+1](1<=i<=j+1)最大值就是以A[j+1]结尾的最大子数组

设K[j+1]为以A[j+1]结尾的最大子数组,

K[j+1]=K[j]>0?A[j+1]+K[j]:A[j+1](以A[j+1]结尾的最大子数组肯定包含A[j+1],所以只需考虑是否包含其前面的K[j],如果K[j]>0则会包含)

时间: 2024-11-04 23:36:49

求最大子数组分析的相关文章

求连续子数组的最大和

一.题目: 这是一道考的烂的不能再烂的题目,但是依然有很多公司乐于将这样的题目作为笔试或面试题,足见其经典. 问题是这样的:一个整数数组中的元素有正有负,在该数组中找出一个连续子数组,要求该连续子数组中各元素的和最大,这个连续子数组便被称作最大连续子数组.比如数组{2,4,-7,5,2,-1,2,-4,3}的最大连续子数组为{5,2,-1,2},最大连续子数组的和为5+2-1+2=8. 二.解法: 解法一:暴力求解法 /* (1) 常规方法,时间复杂度O(n*n) (2) 先从第一个元素开始向后

【LeetCode】Maximum Product Subarray 求连续子数组使其乘积最大

Add Date 2014-09-23 Maximum Product Subarray Find the contiguous subarray within an array (containing at least one number) which has the largest product. For example, given the array [2,3,-2,4],the contiguous subarray [2,3] has the largest product = 

求连续子数组的和最大

题目描述:输入一个整形数组,数组里有正数也有负数.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为O(n). 思路: 我们可以使用分治法或者减治法来处理这个问题. 分治法    目标:把1个大问题分成2个小问题,2个小问题还可以再分,直到问题规模小的可以简单解决. 将该数组等分成两个子数组,假如知道左右两侧两个数组的各自的最大子数组和,那么整个数组的最大子数组和可能为三种情况: 右侧数组的最大子数组和 左侧数组的最大子数组和 左右两侧数

最大子数组问题(求连续子数组的最大和)

在<算法导论>第四章分治策略(Divider and Conquer)4.1节提出了最大子数组问题.其转化就是求数组a={1, -2, 3, 10, -4, 7 , 2, -5}中连续子数组的最大和. 对于这个问题,很容想到一种暴力求解的方法:简单地尝试对所有可能的的组合进行求和.对数组为n存在n*(n-1)/2中组合,然后对每个组合进行求和.即三个for循环遍历,求出数组中每一个子数组的和,最终求出这些子数组的最大的一个值.记Sum[i,...,j]为数组a中第i个元素到第j个元素的和(其中

首尾相连的循环数组求其子数组最大值

结对成员 曹坤  翟凯 题目 返回一个整数数组中最大子数组的和. 要求: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大. 同时返回最大子数组的位置. 思路 经过讨论,只需将数组扩展为2倍长度,array[i]=array[length+i];从第一个元素开始依 次五个元素为一组,共分为五组进行:分别求得五个最大子数组和

分治法求连续子数组的最大和

思路来自算法导论,将数组平分为左右两个子数组,那么最大子数组可能在左边的子数组中,也有可能在右边的子数组中,还有可能跨过中间的元素,只有这三种情况.对于前两种情况,可以使用递归求解,对于第三种情况,可以做到用线性时间复杂度的函数来求解,详见代码. #include <iostream> #include <map> using namespace std; //the thought of this algrithm is devide-and-couque int int_max

求子数组最大值

设计思路:用户输入一个数组本次规定为4个数的数组,可根据需要进行修改,关于如何求出子数组中和的最大值:应该先明确最大值的来源数组一定包括原来数组中的最大值,因此找到这个最大值并记录下标,定义两个和的变量temp和temp1,从最大值下标开始逐一求和比较最终得到子数组最大的和. 源代码: package arrsum; import java.util.Scanner; public class Sum { public static void main(String[] args) { int

结对开发首尾相接数组求子数组最大和

组员:燕亚峰  20122914           王童博   20122823 一.题目及要求: 返回一个整数数组中最大子数组的和 如果数组A[0]...A[j-1]首尾相邻,允许A[i-1]...A[n-1],A[0]...A[j-1]之和最大:同时返回最大子数组的位置. 二.设计思路: 对于这题本想延用一维数组的方法,不过由于数组进行了整合,始末位置无法判断.所以此种方法断然没有实现. 可以形成一个固定长度的窗口,依次相加比较. 首先将为两种情况,一种是跨越a[n-1],a[0]的.一种

首尾相接数组求子数组最大和

一.题目及要求: 返回一个整数数组中最大子数组的和 如果数组A[0]...A[j-1]首尾相邻,允许A[i-1]...A[n-1],A[0]...A[j-1]之和最大:同时返回最大子数组的位置. 二.设计思路: 对于这题本想延用一维数组的方法,不过由于数组进行了整合,始末位置无法判断.所以此种方法断然没有实现. 小伙伴曾说延用课上学生提供的方法,形成一个固定长度的窗口,依次相加比较.这不失为一个好方法.只可惜时间复杂度不是n. 于是上网查了点资料.思想有点引用网上的了.首先将为两种情况,一种是跨