算法:最大子数组own
转载标明出处: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的更多相关文章
- [PHP]算法-最大子数组问题思路
最大子数组问题,股票价格示例: 1.在最高价格开始向左寻找之前的最低价格 2.在最低价格开始向右寻找之后的最高价格 3.暴力求解法,尝试每队可能的买进和卖出组合,保证卖出在买进之后 key buy s ...
- 在Eclipse中使用Junit进行单元测试练习 实现最大子数组和算法
1.如何在MAC OS X下安装配置java开发工具 http://www.cnblogs.com/coderL/p/5939541.html 2.最大子数组和算法 附上程序运行及测试截图,源码见后 ...
- ubuntu16.04下配置JDK 1.8+安装Java EE,并实现最大子数组算法
软工第二次作业: 1.在个人电脑中安装一个集成开发环境(Microsoft Visual Studio.Eclipse或其它工具均可),要求该环境能够提供单元自动测试功能: 2.记录安装过程,并将全部 ...
- 【LeetCode-面试算法经典-Java实现】【053-Maximum Subarray(最大子数组和)】
[053-Maximum Subarray(最大子数组和)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Find the contiguous subarray w ...
- 【Coding算法导论】第4章:最大子数组问题
Coding算法导论 本系列文章主要针对算法导论一书上的算法,将书中的伪代码用C++实现 代码未经过大量数据测试,如有问题,希望能在回复中指出! (一)问题描述 给定一个数组,求数组中连续的子数组的和 ...
- 【算法导论C++代码】最大子数组
#define Inf 65535 #include <iostream> using namespace std; void FindMaxCrossingSubarray(int *A ...
- 力扣算法JS LC 59-螺旋矩阵2,LC 152-乘积最大子数组
LC 59-螺旋矩阵2 给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix . 示例 1: 输入:n = 3输出:[[1,2 ...
- 求一个数组的最大子数组(C/C++实现)
最大子数组:要求相连,加起来的和最大的子数组就是一个数组的最大子数组.编译环境:VS2012,顺便说句其实我是C#程序员,我只是喜欢学C++. 其实这是个半成品,还有些BUG在里面,不过总体的思路是这 ...
- 求解数组环中最大子数组和的问题(java)
//石家庄铁道大学 信1405-1 班 唐炳辉 在上一次作业中,对于普通数组的最大子数组的求解问题的基础上,将普通的数组变成一个首尾相接的环,求这个环的最大子数组.类似的,只要改变普通数组的数组位置, ...
- homework-01 "最大子数组之和"的问题求解过程
写在前面:我的算法能力很弱,并且也是第一次写博文,总之希望自己能在这次的课程中学到很多贴近实践的东西吧. 1.这次的程序是python写的,这也算是我第一次正正经经地拿python来写东西,结果上来说 ...
随机推荐
- 用rbenv给整个系统安装ruby(所有用户都可用)
rbenv非常好用,但有一个小问题,每个用户都需要单独安装和设置版本. 下面安装步骤可以安装在/usr/local/rbenv下,所有用户都可以共享rbenv. #rbenv安装(/usr/loc ...
- java读取某个文件夹下的所有文件
import java.io.FileNotFoundException;import java.io.IOException;import java.io.File; public class Re ...
- USACO Section 4.2: The Perfect Stall
这题关键就在将题转换成最大流模板题.首先有一个原始点,N个cow个点, M个barn点和一个终点,原始点到cow点和barn点到终点的流都为1,而cow对应的barn就是cow点到对应barn点的流, ...
- 同一Session中的aspx页面的并发限制
项目中客户端采用WebBrowser展示aspx页面,用户有可能打开带多个带WebBrowser的winform窗体.此时,如果其中一个的WebBrowser的aspx页面响应较长的话,其他窗体中的W ...
- Flex 容器基本概念
申明文章出处:http://www.adobe.com/cn/devnet/flex/articles/flex-containers-tips.html Flex 4 容器可以提供一套默认的布局:B ...
- 解决 iReport 生成 pdf 时显示不出中文的问题
有没有遇到这样的情况:在使用 iReport 做报表时,用pdf预览显示不出中文? 解决步骤是这样的: 1.加入jar包 下载两个jar包:itextasian.jar 和 itext-x.y.jar ...
- 基于Linux的oracle数据库管理 part3( 存储 网络 常用命令 )
主要内容 1. 常用存储模式 2. 配置网络 3. 维护指令 常用存储模式 - 文件系统 优点:管理方便, 缺点:读写慢 - 裸设备 只没有被格式化和挂载的磁盘, 只能有程序直接访问, 不能被操作系统 ...
- React学习、安装及QuickStart
首先看的是这个页面 http://www.cocoachina.com/webapp/20150721/12692.html 这里有个内容差不多的版本(精华版):http://www.cnblogs. ...
- 什么是HotSpot VM & 深入理解Java虚拟机
参考 http://book.2cto.com/201306/25434.html 另外,这篇文章也是从一个系列中得出的: <深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)> ...
- BZOJ 3694 最短路
233333想简单了.... 题解参见http://hzwer.com/3710.html #include<iostream> #include<cstdio> #inclu ...