最大子数组的线性解法

题目出自算法导论第三版,4.1-5.

该题中提出“在已知A[1...j]中最大子数组的情况下,可以在线性时间内找出形如A[i...j+1](1<=i<=j+1)的最大子数组”,这一点让我大惑不解。如果这样是线性的话,那遍历数组,总的解法不又是O(N²)了么?又何谈O(N)?

必然得在常量时间内找出A[i...j+1]才行。那么如何在常量时间内找出它呢?

时间: 2024-11-08 05:57:00

最大子数组的线性解法的相关文章

最大子数组问题全解

问题描述 给定一个整数数组,找到一个具有最大和的子数组,返回其最大和. 问题解析 很经典的一个问题,下面给出3种解法,暴力解法.分治算法.动态规划.这个题Leetcode上有大量测试数据,只不过最后两个测试数据要求算法复杂度为n,只能用动态规划来解,可以借鉴一下,链接见这里https://leetcode.com/problems/maximum-subarray/description/ 问题解决 1.暴力解法 穷举所有的子串,计算他们的和,然后从中找出最大的一个. //最大子数组的暴力解法

最大连续子数组,线性时间解法

思想: 经过分析可得,若子数组和为负数就已经代表这个子数组不可能为最大子数组了,相反若子数组和为正,则将最大的和比较出来便可. 故可直接遍历该数组一旦子数组和已为负数,则置为0,否则与之前的最大值进行比较,得出目前最大值. 上代码: #include<iostream> using namespace std; int getMax(int *arr,int n,int start,int end){ int max; int firstmax = arr[0]; max = arr[0];

算法导论笔记2 - T(n) = O(n) 的最大子数组问题解法

import random __author__ = 'Administrator' LENGTH = 500 base = [] for i in range(0, LENGTH * 2): base.append(random.randint(-1 * LENGTH, LENGTH)) print(base) bsa_i = 0 bsa_j = 1 bsa = base[0] bord = base[0] bord_i = 0 for i in range(1, len(base)): if

分治法——最大子数组

题目描述: 给定一个n个元素的数组a,求a[i]+a[i+1]+-+a[j]的最大值(0 <= i <= j < n) 解题思路: 我们来试试用分治法来解决这个问题.首先我们想要找到一个子数组a[i-j]为最大子数组,我们假设数组的中点为mid,可以将数组a[low-high]分成两个子数组:a[low-mid]和a[mid+1-high],那么最大子数组必然为下述三种可能之一: 1) low <= i , j <= mid ; 2) mid < i , j <=

三种方法求最大子数组的和

这是一道考的烂的不能再烂的题目,但是依然有很多公司乐于将这样的题目作为笔试或面试题,足见其经典. 问题是这样的:一个整数数组中的元素有正有负,在该数组中找出一个连续子数组,要求该子数组中各元素的和最大,这个子数组便被称作最大子数组.比如数组{2,4,-7,5,2,-1,2,-4,3}的最大子数组为{5,2,-1,2},最大子数组的和为5+2-1+2=8. 下面按照时间复杂度逐步优化的顺序依次给出这三种算法. 暴力求解法 该方法的思想非常简单,先找出从第1个元素开始的最大子数组,而后再从第2个元素

最大子数组问题 Maximum Subarray

Maximum Subarray 标签(空格分隔): algorithm 这个问题我们先看下问题的描述: 问题描述 Find the contiguous subarray within an array (containing at least one number) which has the largest sum. For example, given the array [?2,1,?3,4,?1,2,1,?5,4], the contiguous subarray [4,?1,2,1

分治策略 &nbsp; 最大子数组问题

递归式 递归式与分治方法是紧密相关的,因为使用递归式可以很自然地刻画分治算法的运行时间.一个递归式就是一个等式或不等式,它通过更小的输入上的函数值来描述一个函数.例如,在2.3.2节,我们用递归式描述了MERGE-SORT过程的最坏情况运行时间T(n): Θ(1)        若n=1 T(n) =                         (4.1) 2T(n/2)+Θ(n)    若n>1 求解可得T(n)=Θ(nlgn) 递归式可以有很多形式.例如,一个递归算法可能将问题划分为规模

最大子数组

/*求子数组的最大和题目描述:输入一个整形数组,数组里有正数也有负数.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值.要求时间复杂度为O(n). 例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18.*/ 1 #include<stdio.h> 2 typedef struct addelem{ 3 int low; 4 int high; 5 int max;

循环数组,求和最大子数组

题目: 返回一个整数数组中最大子数组的和. 要求: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大. 同时返回最大子数组的位置. 求所有子数组的和的最大值.要求时间复杂度为O(n). 思路: 1. a.定义长度为n的一维数组,实际随机生成的时候生成长度为2n的数组,即n+1~2n是对1~n的重复 b.利用长度为n时的求法