算法:最大子数组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来写东西,结果上来说 ...
随机推荐
- requirejs 优化压缩
1 配置node环境 2 配置built.js文档 3 执行命令node r.js -o built.js 文件目录: <!DOCTYPE HTML> <html lang=&quo ...
- php克隆 自动加载
PHP加载 include() 函数 include() 函数可获得指定文件中的所有文本,并把文本拷贝到使用 include 函数的文件中. 例子 1 假设您拥有一个标准的页眉文件,名为 " ...
- KMP,模式匹配算法
[QQ群: 189191838,对算法和C++感兴趣可以进来] 我们经常会遇到一种情况是匹配两个字符串,看strPar中是否含有str子串,如果有则返回子串在父串strPar中的位置,如果不存在则返回 ...
- 安装hadoop
生成yum源 cd /var/ftp/pub/cdh/5 createrepo --update . 从节点 yum clean all 配置yum库 /etc/yum.repos.d # cat / ...
- oracle创建表空间、创建用户、授权、夺权、删除用户、删除表空间
表空间定义 表空间是为了统一ORACLE物理和逻辑上的结构而专门建立的,从物理上来说,一个表空间是由具体的一个或多个磁盘上数据文件构成的(至少1对1,可以1对多),从逻辑上来说一个表空间是由具体的一个 ...
- ural1221. Malevich Strikes Back!
http://acm.timus.ru/problem.aspx?space=1&num=1221 算是枚举的 题目意思是必须划出这样的 11011 10001 00000 10001 110 ...
- C# Winform 获取天气情况
WebServices(http://www.webxml.com.cn/WebServices/WeatherWebService.asmx)来实现天气预报,该天气预报 Web 服务,数据来源于中国 ...
- 盒模型padding和margin对滚动条位置的影响
前置条件:盒模型样式overflow-y:scroll; ①padding-right:15px的效果: padding对于滚动条的位置显然是没有影响的,这也不是我们要的结果(这样很难看!) ②mar ...
- UVa 10420 List of Conquests
题意就是有N个pl妹子,然后每行第一个单词是妹子的国籍,后面是妹子的名字. 你的任务就是统计相同国籍妹子的个数,然后按字母表顺序输出. 我首先把所有的国籍都读入,然后用qsort()按字母表顺序排序. ...
- 51nod1354 选数字
01背包tle. 解题报告(by System Message) 类似于背包的DP,以乘积为状态.先把等选数字里面不是K约数的去掉.然后找出K的约数,进行离散化.然后dp[i][j]表示前i个数字乘积 ...