求最大子数组的和,算法导论只分治递归求解,暴力求解,记忆扫描方法。

#include<iostream>
#include<vector>
using namespace std;
/*******************************************************************************************/
//  分治方法,利用递归的思想
//  ugly_chen     2014.11.3  22:24
//说明:把数组分为两部分,右边部分和左边部分,要不就是右边部分和左边部分之和.
// ——————————————————————》时间: O(NlogN)
/********************************************************************************************/
int  find_max_cross_subArray(int a[], int left, int mid, int right)
{
	int left_sum = 0;
	int max_left_sum = 0;
	for (int i = mid; i >= left; i--)
	{
		left_sum += a[i];
		if (left_sum > max_left_sum)
		{
			max_left_sum = left_sum;
		}

	}

	int right_sum = 0;
	int max_right_sum = 0;
	for (int i = mid + 1; i <= right; i++)
	{
		right_sum += a[i];
		if (right_sum > max_right_sum)
		{
			max_right_sum = right_sum;
		}
	}

	return max_left_sum + max_right_sum;
}

int find_max_subArray(int a[], int left, int right)
{
	int left_sum, right_sum, cross_sum;
	if (left == right)
	{
		return a[left];
	}
	else
	{
		int mid = (left + right) / 2;
		left_sum = find_max_subArray(a, left,mid);
		right_sum = find_max_subArray(a, mid + 1, right);
		cross_sum = find_max_cross_subArray(a, left, mid, right);
	}

	if (left_sum >= right_sum && left_sum >= cross_sum)
		return left_sum;
	else if (right_sum >= left_sum && right_sum >= cross_sum) //右边
		return right_sum;
	return cross_sum;
}
/*——————————————————————————————————————————————————————————————————————————————————————————*/
//方法二:最暴力的方法  这里使用vector数组    时间: O(N^3)
//introduction: 对每一个可能的组合求和,然后比较最大的和.
/*———————————————————————————————————————————————————————————————————————————————————————————*/
int find_max_array2(const vector<int> &a)
{
	int max_sum = 0;
	for (size_t i = 0; i < a.size(); i++)
	{
		for (auto j = i; j < a.size(); j++)
		{
			int this_sum = 0;
			for (auto k = i; k <= j; k++)
				this_sum += a[k];

			if (this_sum>max_sum)
				max_sum = this_sum;
		}
	}
	return max_sum;
}

/************************************************************************************************/
//方法三:对上面的算法进行简化(实际上是去掉上面的第二层循环)
//introduction:还是所有组合的和,,每一次循环求出取其中最大的和保存在max_sum中.
// ——————————————————————》时间: O(N^2)
/*************************************************************************************************/
int find_max_array3(const vector<int> &a)
{
	int max_sum = 0;
	for (size_t i = 0; i < a.size(); i++)
	{
		int this_sum = 0;
		for (auto j = i; j < a.size(); j++)
		{
			this_sum += a[j];

			if (this_sum>max_sum)
				max_sum = this_sum;
		}
	}

	return max_sum;
}

/*————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————*/
//方法四:对数组中的元素进行扫描,用this_sum记录扫描元素的和,从跟第一个元素开始扫描,this_sum不能小于0,如果小于0,那么
//this_sum从新记录扫描元素的和(这个时候this_sum置为0),如果this_sum不为0,那么就和max_sum比较(大于max_sum那就把this_sum的
//值给max_sum,不大于就不变)意思就是扫描到的最大和保存在max_sum中。
// ——————————————————————》时间: O(N)
/*—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————*/
int find_max_array4(const vector<int> &a)
{
	int max_sum = 0;
	int this_sum = 0;
	for (size_t i = 0; i < a.size(); i++)
	{
		this_sum += a[i];

		if (this_sum > max_sum)
			max_sum = this_sum;
		else if (this_sum < 0)
			this_sum = 0;
	}

	return max_sum;
}

int main()
{
	int a[] = { 9, 6, -7, 1, 8,-20, 5, 3, 4, 0, 2 };
	std::cout << find_max_subArray(a, 0, 10) << std::endl;

	vector<int> aVec = { 9, 6, -7, 1, 8, -20, 5, 3, 4, 0, 2 };

	std::cout << find_max_array2(aVec) << std::endl;

	std::cout << find_max_array3(aVec) << std::endl;

	std::cout << find_max_array4(aVec) << std::endl;

	return 0;
}

时间: 2024-08-06 03:25:30

求最大子数组的和,算法导论只分治递归求解,暴力求解,记忆扫描方法。的相关文章

数组问题之求最大子数组问题(一)

结束了 四则运算的所有内容 这次老师布置了 数组问题 求最大子数组的问题 课堂上 老师就已经提供了数种方案 并提出了时间复杂度的要求 于是和我的搭档找到了认为最为简便的算法 过程中和小于0,那么和最大的子数组不会包含前面子数组,之后将和归0,从下个元素重新开始计算 于之前的实验 理清思路 代码实现不算太难 代码如下 1 #include<iostream> 2 using namespace std; 3 4 int main() 5 { 6 int i,num; 7 cout <<

循环一维数组求最大子数组

题目: 随机出一个一维数组,设该数组为循环数组,求其最大小子数组. 一.设计思路 求最大子数组,就求出最大的连续正子数组. 将数组分为全负和有非负值两种情况.全负求出最大值即可. 在有非负值的情况下,先判断该随机数组的首尾是否相连,即首尾是否都大于等于零.如果首尾相连,则将该一维数组分为首.中.尾三部分,先求出首尾和S1,再求中间最大连续正子数组和S,令S1和S与maxS相比较,求出最大子数组:如果首尾不相连,则直接借鉴前一种情况中部的算法,求最大正子数组S. 二.源代码 1 //刘双渤,刘洪阳

Maximum Product Subarray 求最大子数组乘积

这个求最大子数组乘积问题是由最大子数组之和问题演变而来,但是却比求最大子数组之和要复杂,因为在求和的时候,遇到0,不会改变最大值,遇到负数,也只是会减小最大值而已.而在求最大子数组乘积的问题中,遇到0会使整个乘积为0,而遇到负数,则会使最大乘积变成最小乘积,正因为有负数和0的存在,使问题变得复杂了不少.. 比如,我们现在有一个数组[2, 3, -2, 4],我们可以很容易的找出所有的连续子数组,[2], [3], [-2], [4], [2, 3], [3, -2], [-2, 4], [2,

求最大子数组的和,以及求该最大子数组的起始位置和末尾位置

问题描述: 一个数组,长度为N,数组元素有负有正,如{-1, 4, 6, -3, 7, -3, -3, 9}:我们可以清楚的知道最大的子数组应该是4到9,也就是下标1到下标7,和为17. 求解思路: 第一种方法:我们可以用定义1.两个数ThisSum和MaxSum来记录当前数组的和,以及数组的最大和. 2.我们可以用两个for循环来来遍历数组,每一次求出子数组的最大和,每个子数组从0开始,下一次遍历子数组就是从1开始,以此类推.如第一次就[0~N-1]的最大和,第二次就是[1~N-1],第三次就

一维数组头尾相连求最大子数组

题目: 返回一个整数数组中最大子数组的和. 要求: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大. 同时返回最大子数组的位置. 求所有子数组的和的最大值.要求时间复杂度为O(n). 1. 设计思想: 因为已经写过了一维数组的求最大子数组程序.所以只是在原程序上进行修改.首先产生随机数数组,然后进行计算,因为要求时间复杂度

二维数组求最大子数组

设计思路: 首先定义产生二维数组,定义可输入二维数组行和列,各位数随机产生: 然后进行最大子数组的求和比较,从每行的第一个数为子数组的起点开始进行不同的子数组遍历比较,只存放最大的子数组,以及记录最大子数组的位置,从第一个数开始每行每列进行求和比较,以求得最大子数组的值,以及最大子数组所包含的数: 最后进行结果的输出与验证. 代码: 法一: package zishuzu; import java.util.*; public class zuixiaozishuzu { public stat

一维数组求最大子数组(解决溢出问题)

一.题目要求 题目:返回一个整数数组中最大子数组的和. 要求: 要求程序必须能处理1000 个元素: 每个元素是int32 类型的: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为O(n). 二.设计思想 程序在宏里面定义出了数组长度的大小,在长度超过100万的时候程序直接崩溃,其实这并不是因为结果太大导致的数值溢出,而是因为内存溢出,我们的数组是定义在程序内部的,属于局部变量,存放位置在栈上

结对开发,首位相邻的数组求最大子数组

结对人员:张世通 梁世豪 一.题目 返回一维数组中最大子数组的和 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大. 同时返回最大子数组的位置. 求所有子数组的和的最大值. 要求时间复杂度为O(n) 二.设计思路 1.在上一次求一维数组最大子数组的问题上,进行拓展,继续使用类似的求和方法 2.通过定义变量start,fin

结对开发--四实现循环二维数组求最大子数组的和

一.实现思路 再上一个实验基础上加上环,我们实现环的思想是每一列依次向此替换,直至替换出能出现的所有的二维数组,再用上一个求最大子数组的方法全部实现 二.实验代码 package com.minirisoft; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.util.Scanner; public class HuanTwoArray { public stat