算法:最大子数组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来写东西,结果上来说 ...
随机推荐
- ccnu-线段树-单点更新3-C
C - 单点更新3 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status Des ...
- allegro蛇形线
蛇形线设置: 设置之后,框选你要修改的线即可: 修线: --------------------------------
- selenium如何做兼容性测试呢
selenium如何做兼容性测试呢. 现在selenium做自动化测试基本是web driver操作浏览器做操作,code中assert关键值,做判断. 具体执行2种 1.使用htmluint 来执行 ...
- mtk android lcm调试
参考MTK 文档LCM_Customer_document_MT6575.pdf The following shows the steps to add a new LCM driver: (1) ...
- 转:最值得学习阅读的10个C语言开源项目代码
阅读优秀代码是提高开发人员修为的一种捷径…… 1. Webbench Webbench是一个在linux下使用的非常简单的网站压测工具.它使用fork()模拟多个客户端同时访问我们设定的URL,测试 ...
- CSS之切出横幅
简述 上节分享了clip-path来实现一个剪切横幅,本节通过另外一种方式来实现一个更经典的横幅. 简述 最终效果 小三角 效果 源码 阴影分割 效果 源码 合并 最终效果 我们先看一下最终要实现的效 ...
- memcached的LRU删除机制
1)memcached不会自动清空缓存的值如果add了一个值,但不去get它,那么这个值过期了,它也不会被清空.解释:memcached不自动检测和清空值,它只当你需要get这个值的时候,才检测这个值 ...
- 事件对象event和计时器
事件对象:event 属性: srcElement事件源对象 keyCode 键盘按键Ascii码 window方法: 定时器: 1)setTimeout();//n毫秒后执行一次 2)setInte ...
- cppunit使用详解
cppunit使用详解 第一步:如何安装 (我的运行环境: fc7 Linux, gcc4) cppunit 的安装是相当标准的linux的安装过程 a. 下载cppunit的源文件 ...
- codeforces 340B Maximal Area Quadrilateral(叉积)
事实再一次证明:本小菜在计算几何上就是个渣= = 题意:平面上n个点(n<=300),问任意四个点组成的四边形(保证四条边不相交)的最大面积是多少. 分析: 1.第一思路是枚举四个点,以O(n4 ...