转载标明出处:http://i.cnblogs.com/EditPosts.aspx?postid=4726782&update=1

暴力法:

 // maxValue.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include <iostream> using namespace std; int findMax(int *a,int low,int high,int &sub_left,int &sub_right,int &sub_sum)
{
if (low==high)
{
if(a[low]>)
{
sub_left=low;
sub_right=high;
sub_sum=a[low];
}
else sub_sum=;
} else
{
for(int i=;i<=high;i++)
{
int tempSum=;
for (int j=i;j<=high;j++)
{
tempSum+=a[j];
if (tempSum>sub_sum)
{
sub_sum=tempSum;
sub_left=i;
sub_right=j;
}
}
}
}
return ;
} int _tmain(int argc, _TCHAR* argv[])
{
int sub_left=;
int sub_right=;
int sub_sum=;
int a[]={,-,-,,-,-,-,,,-,,-,-,,-,};
findMax(a,,,sub_left,sub_right,sub_sum);
cout<<sub_left<<" "<<sub_right<<" "<<sub_sum<<endl;
system("pause");
return ;
}

时间复杂度:O(n*n);

分治法:

// maxSubArray.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include <iostream> using namespace std; int Find_Max_cross_subArray(int *a,int low,int middle,int high,int &max_left,int &max_right,int &max_value)
{
int left_sum=-;
int sum=;
for (int i=middle;i>=low;i--)
{
sum+=a[i];
if (sum>left_sum)
{
left_sum=sum;
max_left=i;
}
} int right_sum=-;
sum=;
for (int j=middle+;j<=high;j++)
{
sum+=a[j];
if (sum>right_sum)
{
right_sum=sum;
max_right=j;
}
}
max_value=left_sum+right_sum;
return ; } int Find_Max_subArray(int *a,int low,int high,int &max_left,int &max_right,int &max_vlaue)
{
if (low==high)
{
if (a[low]>)
{
max_vlaue=a[low];
max_left=low;
max_right=high;
}
else max_vlaue=;
}
else
{
int middle=(low+high)/;
int tem_left_low;
int tem_left_high;
int tem_left_sum;
Find_Max_subArray(a,low,middle,tem_left_low,tem_left_high,tem_left_sum); int tem_right_low;
int tem_right_high;
int tem_right_sum;
Find_Max_subArray(a,middle+,high,tem_right_low,tem_right_high,tem_right_sum); int tem_cross_low;
int tem_cross_high;
int tem_cross_sum;
Find_Max_cross_subArray(a,low,middle,high,tem_cross_low,tem_cross_high,tem_cross_sum); if (tem_left_sum>=tem_right_sum&&tem_left_sum>=tem_cross_sum)
{
max_left=tem_left_low;
max_right=tem_left_high;
max_vlaue=tem_left_sum;
}
else if (tem_right_sum>=tem_left_sum&&tem_right_sum>=tem_cross_sum)
{
max_left=tem_right_low;
max_right=tem_right_high;
max_vlaue=tem_right_sum;
}
else
{
max_left=tem_cross_low;
max_right=tem_cross_high;
max_vlaue=tem_cross_sum;
}
}
return ;
} int _tmain(int argc, _TCHAR* argv[])
{
int max_left=;
int max_right=;
int max_value=;
int a[]={,-,-,,-,-,-,,,-,,-,-,,-,};
Find_Max_subArray(a,,,max_left,max_right,max_value);
cout<<max_left<<" "<<max_right<<" "<<max_value<<endl;
system("pause");
return ;
}

递归式: T(n)=2*T(n/2)+Theta(n);n>1

T(n)=theta(1);

非递归线性算法:(4.1-5)

此方是看了我转载的那个伙伴的才有思路,和为负数,就跳过。

 // Max_Value.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include <iostream>
using namespace std; int Max(int *a,int low,int high,int &sub_left,int &sub_right,int &sub_sum)
{
if (low==high)
{
if (a[low]>)
{
sub_sum=a[low];
sub_left=low;
sub_right=high;
}
else sub_sum=;
}
int tempSum=;
for (int i=low;i<=high;i++)
{
tempSum+=a[i];
if (tempSum<=)
{
tempSum=;
sub_left=i+;
}
if (tempSum>sub_sum)
{
sub_sum=tempSum;
sub_right=i;
}
}
return ;
}
int _tmain(int argc, _TCHAR* argv[])
{
int sub_left=;
int sub_right=;
int sub_sum=;
int a[]={,-,-,,-,-,-,,,-,,-,-,,-,};
Max(a,,,sub_left,sub_right,sub_sum);
cout<<sub_left<<" "<<sub_right<<" "<<sub_sum<<endl;
system("pause");
return ;
}

只扫描了一遍,时间复杂度为O(n);

以上方法输出结果都一样:7 10 43

算法:最大子数组own的更多相关文章

  1. [PHP]算法-最大子数组问题思路

    最大子数组问题,股票价格示例: 1.在最高价格开始向左寻找之前的最低价格 2.在最低价格开始向右寻找之后的最高价格 3.暴力求解法,尝试每队可能的买进和卖出组合,保证卖出在买进之后 key buy s ...

  2. 在Eclipse中使用Junit进行单元测试练习 实现最大子数组和算法

    1.如何在MAC OS X下安装配置java开发工具 http://www.cnblogs.com/coderL/p/5939541.html 2.最大子数组和算法 附上程序运行及测试截图,源码见后 ...

  3. ubuntu16.04下配置JDK 1.8+安装Java EE,并实现最大子数组算法

    软工第二次作业: 1.在个人电脑中安装一个集成开发环境(Microsoft Visual Studio.Eclipse或其它工具均可),要求该环境能够提供单元自动测试功能: 2.记录安装过程,并将全部 ...

  4. 【LeetCode-面试算法经典-Java实现】【053-Maximum Subarray(最大子数组和)】

    [053-Maximum Subarray(最大子数组和)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Find the contiguous subarray w ...

  5. 【Coding算法导论】第4章:最大子数组问题

    Coding算法导论 本系列文章主要针对算法导论一书上的算法,将书中的伪代码用C++实现 代码未经过大量数据测试,如有问题,希望能在回复中指出! (一)问题描述 给定一个数组,求数组中连续的子数组的和 ...

  6. 【算法导论C++代码】最大子数组

    #define Inf 65535 #include <iostream> using namespace std; void FindMaxCrossingSubarray(int *A ...

  7. 力扣算法JS LC 59-螺旋矩阵2,LC 152-乘积最大子数组

    LC 59-螺旋矩阵2 给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix . 示例 1: 输入:n = 3输出:[[1,2 ...

  8. 求一个数组的最大子数组(C/C++实现)

    最大子数组:要求相连,加起来的和最大的子数组就是一个数组的最大子数组.编译环境:VS2012,顺便说句其实我是C#程序员,我只是喜欢学C++. 其实这是个半成品,还有些BUG在里面,不过总体的思路是这 ...

  9. 求解数组环中最大子数组和的问题(java)

    //石家庄铁道大学 信1405-1 班 唐炳辉 在上一次作业中,对于普通数组的最大子数组的求解问题的基础上,将普通的数组变成一个首尾相接的环,求这个环的最大子数组.类似的,只要改变普通数组的数组位置, ...

  10. homework-01 "最大子数组之和"的问题求解过程

    写在前面:我的算法能力很弱,并且也是第一次写博文,总之希望自己能在这次的课程中学到很多贴近实践的东西吧. 1.这次的程序是python写的,这也算是我第一次正正经经地拿python来写东西,结果上来说 ...

随机推荐

  1. Matlab多个Figure图合成一个Fig

    案例:之前跑过的程序 已经生成了多个matlab图,现在需要进行合并到一个图中. 解决方案,利用图像句柄把figure图像中的参数读入到内存中,然后重新subplot绘制. 程序如下: clc;cle ...

  2. protobuf php

    关于protobuf php,版本不知哪个好: https://github.com/yuangu/pb4php https://github.com/drslump/Protobuf-PHP htt ...

  3. USACO Section 3.3: A Game

    第一次碰到博弈论题目,是很棘手,博弈论题目要考虑全局最优的解法,我第一次用了局部最优的,而且vector也没pop_front()操作.后来看了网上的用dp的方法解的. 博弈论的题目基本都得用dp法子 ...

  4. LINUX内核分析第四周学习总结——扒开应用系统的三层皮(上)【转】

    转自:http://www.cnblogs.com/lalacindy/p/5276874.html 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://moo ...

  5. Linux下音频编程-输出音频文件

    程序实现了在Linux下播放Ok.wav的功能.程序首先调用fstat函数获得文件相关信息(主要是文件大小信息).通过malloc函数分配指定的内存空间,并将online.wav读入内存:然后,打开声 ...

  6. 【HDOJ】1362 The Bermuda Triangle

    1. 题目描述给定几个三角形拼成一个百慕大三角形. 2. 基本思路基本思路肯定是搜索,关键点是剪枝.(1) 若存在长度为$l$的边,则一定可以拼成长度为$k \cdot l$的三角形,则可拼成长度为$ ...

  7. 实际利率 > 名义利率

    名义利率与实际利率的关系为:实际利率=(1+名义利率/计息周期)计息周期-1. 如计息周期数=1时,两者相等.如计息周期数大于1时,实际利率大于名义利率,当计息周期数小于1时,实际利率小于名义利率. ...

  8. jQuery_效果(滑动)

    1.jQuery slideDown() 方法(用于向下滑动元素) 语法:$(selector).slideDown(speed,callback); 可选的 speed 参数规定效果的时长.它可以取 ...

  9. R语言串行与并行Apply用法

    串行 APPLY<- function(m){ mTemp <- apply(m, 2, mysort) return(mTemp)} snowfall包的并行 SNOWFALL<- ...

  10. 最小生成树之Kruskal

    模板题,学习一下最小生成树的Kruskal算法 对于一个连通网(连通带权图,假定每条边上的权均为大于零的实数)来说,每棵树的权(即树中所有边的权值总和)也可能不同 具有权最小的生成树称为最小生成树 生 ...