Algorithm One Day One--求输入的数组其子数组的最大值

算法是编程的灵魂,是编程思想的精髓————Algorithm One Day One

/********************************************************************
created:2015年1月19日 00:20:59
author: Jackery     T(n)=Ο(n)
purpose: 本程序是求输入的一个数组,求其子数组的最大值;
*********************************************************************/
#include"stdafx.h"
#include<iostream>
typedef int DataType;

DataType Arrlen(DataType array[]);
void SubAarr_MaxSum(DataType array[], DataType len);
using namespace std;

void main()
{
	DataType array[]={0,12,-11,5};
	DataType length=sizeof(array)/sizeof(DataType);
	SubAarr_MaxSum(array,length);
}

void SubAarr_MaxSum(DataType array[],  DataType len)
{
	if(NULL == array || len <=0){
		return;
	}

	int curSum = 0, SubAarr_MaxSum = 0;
	//首先考虑数组有正、有负或者有零的情况
	for(int i=0; i<len; i++){
		curSum += array[i];		// 累加

		if(curSum < 0){			// 当前和小于0,重置为0
			curSum = 0;
		}
// 当前和大于最大和,则重置最大和
		if(curSum > SubAarr_MaxSum){
			SubAarr_MaxSum = curSum;
		}
	}
//接下来考虑数组中元素均为零的情况
	if(SubAarr_MaxSum == 0){
		SubAarr_MaxSum = array[0];
		for(int i=1; i<len; i++){
			if(array[i] > SubAarr_MaxSum){
				SubAarr_MaxSum = array[i];
			}
		}
	}
  cout << "最大子数组的和为:" << endl;
   cout << "SubAarr_MaxSum= " << SubAarr_MaxSum<< endl;
}

To be improved :

1.实现动态输入数组;

2.如何找出其子数组中最大数组所在数组的元素并输出;



时间: 2024-08-04 01:10:20

Algorithm One Day One--求输入的数组其子数组的最大值的相关文章

首尾相接的数组的子数组的最大值

设计思想:输入一定长度的数组,分别以每个数为数组的开头,进行一维非环的数组求最大值,得出最大值,为首尾相接的数组的最大值, 程序源代码: package sumarray; import java.util.InputMismatchException; import java.util.Scanner; public class MaxSum { public static void main(String args[]) { int maxsum=0,sum=0;//maxsum为sum中的

求数组的子数组的最大值(文件存储)

这周我们老师布置了在上一周的基础上实现文件的存储以及读取,刚开始我先将文件存储以及相关的程序写出来,通过询问老师发现对于数组空间的定义可以使用变量形式,经过这个方法我完成了对任意大小的数据可以进行储存以及读取,之后有听取其他同学的惊讶能使用biginteger类来实现大数据的存储. 源代码: package lianxi; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; impo

二维数组求子数组之和最大值(首尾相接, 圆柱)

问题:求二维数组的子数组之和的最大值(首尾相接,即形成圆柱) 成员: 陈晨:负责代码复审和代码测试计划 王颖瑞:负责程序分析,代码编程 思路:对于这个问题,我们可以结合之前的实验(二维数组求子数组之和的最大值和首尾相连一维数组的子数组之和的最大值),把为二维数组的列扩大二倍,之后想一维数组(首尾相连)一样,把二维数组分成不同的几个二维数组.之后就分开求不同的二维数组的子数组的最大值,最后之间比较,求出总的最大值. 代码: #include<iostream> using namespace s

二维数组子数组的最大值之和

题目:求一个二维数组中其子数组之和的最大值. 人员: 陈晨:负责程序编写. 王颖瑞:负责代码复审和代码测试. 思路:对于求二维数组的子数组之和,思路和求一维数组的相差不多,但需要分析更多的情况,我跟舍友讨论之后,之后写的.以下是我的思路: 1.确定子数组的最大上界,从第一行依次向下,规定最大子数组的范围. 2.对于规定好的最大子数组的范围,把最大子数组按照一列有几个数,分成几种不同的行.(如第一组只有一行,第二组有两行等,列数和数组的列数相同) 3.对于第二步产生的几个数组,进行一维数组求子数组

编程之美之2.14 求数组的子数组之和的最大值

[题目] 一个有N个整数元素的一维数组(A[0],A[1],A[2],...A[n-1]),这个数组中当然有很多子数组,那么子数组之和的最大值是多少? 该子数组是连续的. 我们先来明确一下题意: (1)子数组意味着是连续的. (2)题目只需要求和,并不需要返回子数组的具体位置. (3)数组的元素是整数,所以数组可能包含正整数,负整数或者零. 举几个例子: 数组:[1,-2,3,5,-3,2]返回8 数组:[0,-2,3,5,-1,2]返回9 数组:[-9,-2,-3,-5,-3]返回8 [解法一

[编程之美] 2.14 求数组的子数组之和的最大值

问题描述:给定一个包含N个整数的数组,求数组的子数组之和的最大值. 这是递归和贪心策略的一个经典问题.现在,对这个问题进行一下总结. 1 明确题意 题目中的子数组要求是连续的,也就是数组中的某个连续部分. 如果数组中都是正整数,直接相加就行.因此,主要是要考虑负数的情况. 2 直接求所有的子数组和 最简单且容易理解的解法是求出所有的子数组和,然后保存最大的和. int MaxSum(int *A, int n) { int maximum = -INF; int sum = 0; int i =

【编程之美】求数组的子数组之和的最大值

一个有N个整数元素的一维数组A[0],A[1],......,A[n-1],这个数组当然有很多子数组,那么子数组的最大值是什么呢? 分析与解法 我们先明确题意: 1. 题目说的子数组,是连续的: 2. 题目只需要求和,并不需要返回子数组的具体位置: 3. 数组中的元素是整数,所以数组可能包含有正整数.零.负整数: 4. 子数组不为空. 解法一:枚举 最简单的办法就是枚举所有的i和j,计算sum[i..j] = A[i]+A[i+1]+...+A[j],遍历所有可能的sum[i..j],找到最大值

求一个数组的子数组的最大和

如题:求一个数组的子数组的最大和,要求O(n)时间复杂度. 由于有了O(n)时间复杂度的限制,所以暴力求解的O(n^2)方法肯定不行.再考虑递归求一个数组a[n]的子数组的最大和,可以分解为a[i]子数组的最大和以及a[n-i-1]之间的某种情况 a[n]的子数组最大和等于a[i]子数组的最大和: a[n]的子数组最大和等于a[n-i-1]: a[n]的子数组最大和跨a[i]和a[n-i-1]: 递归实现的时间复杂度为O(nlg(n)).最后考虑时间复杂度为O(n)的动态规划实现. /** *

编程之美2.14 求数组的子数组之和的最大值

问题描述: 一个有N个整数元素的一维数组(A[0], A[1], A[2],...,A[n-1]),这个数组当然有很多子数组,那么子数组之和的最大值是什么呢? 解法: 1. 暴力解法-------O(N^3) 2. 改进版暴力解法-------O(N^2) *3. 分治算法-------O(NlogN)(暂时未去实现) 4. 数组间关系法-------O(N) 具体思路和代码: 1.暴力解法 思路:Sum[i,...,j]为数组第i个元素到第j个元素的和,遍历所有可能的Sum[i,...,j].