《github一天一道算法题》:分治法求数组最大连续子序列和

看书、思考、写代码!

/***************************************
 * [email protected]
 * blog: http://blog.csdn.net/hustyangju
 * 题目:分治法求数组最大连续子序列和
 * 思路:分解成子问题+合并答案
 * 时间复杂度:O(n lgn)
 * 空间复杂度:O(1)
***************************************/
#include <iostream>

using namespace std;

template<class type>
class max_subarray
{
public:
    max_subarray(type *p):_p(p){}
    ~max_subarray(){}
    type max_aside_subarray(int s,int e);
protected:
    type max_cross_subarray(int s,int m,int e);
    type _max(type a,type b,type c);
private:
    type *_p;
};

template<class type>
type max_subarray<type>::_max(type a, type b, type c)
{
    if((a>=b)&&(a>=c))
        return a;
    else if((b>=a)&&(b>=c))
        return b;
    else
        return c;
}

template<class type>
type max_subarray<type>::max_cross_subarray(int s, int m, int e)
{
    type left_sum=*(_p+m);
    type right_sum=*(_p+m+1);
    for(int i=m;i>=s;i--)
    {
        type sum=0;
        sum+=*(_p+i);
        if(sum>left_sum)
            left_sum=sum;
    }//for
    for(int i=m+1;i<=e;i++)
    {
        type sum=0;
        sum+=*(_p+i);
        if(sum>right_sum)
            right_sum=sum;
    }//for
    return(left_sum+right_sum);
}

template<class type>
type max_subarray<type>::max_aside_subarray(int s, int e)
{
    int m=0;
    type left_sum,right_sum,cross_sum;
    if(s==e)
        return(*(_p+s));
    else
        m=int((s+e)/2);
    left_sum=max_aside_subarray(s,m);
    cross_sum=max_cross_subarray(s,m,e);
    right_sum=max_aside_subarray(m+1,e);
    return _max(left_sum,cross_sum,right_sum);
}

int main()
{
            int array1[10]={1,-2,-3,4,5,6,-7,-8,9,10};
           // float array2[10]={1.0,-2.0,-3.0,4.0,5.2,6.0,-7.0,-8.0,9.0,-10.0};
            max_subarray<int> mysubarray1(array1);
            //max_subarray<float>mysubarray2(array2);
            cout<<"max sum of sub array is: ";
            cout<<mysubarray1.max_aside_subarray(0,9)<<endl;
           // cout<<"max sum of sub array is: ";
            //cout<<mysubarray2.max_aside_subarray(0,9)<<endl;
}

时间: 2024-08-01 10:45:09

《github一天一道算法题》:分治法求数组最大连续子序列和的相关文章

分治法求数组的最大值最小值

实现求数组的最大值最小值,蛮力法要容易的多.本着重在体验分治法的思想的原则: 1 int main(void) 2 { 3 void Maxmin(int a[],int low,int high,int maxmin[2]); 4 int a[10],maxmin[2]; 5 6 printf("Enter 10 integer numbers:\n"); 7 for(int i=0;i<10;i++) 8 scanf("%d",a+i); 9 10 Max

算法题|-分治法解决最大子数组问题

分治法就是将一个复杂难解决问题拆成一些容易解决的小问题,再依次解决而最终解决整个问题 new int[] { 2, -3, 4, 67, 6 } 这样一个下标为0到4的数组,要找最大子数组,需要将其拆分成两个子数组,mid=(0+4)/2 即为0~mid的左数组和mid+1~4的右数组 最大子数组可能会出现在以下三个地方 左数组中的某个最大子数组 右数组中的某个最大子数组 以mid为界,向左找到一个最大数组,向右找到一个最大数组,将两个数组合并 第三种情况非常容易得到,通过遍历查找就可以解决,而

[算法]:分治法-求大整数相乘

#问题大整数相乘 #思路说明 对于大整数计算,一般都要用某种方法转化,否则会溢出.但是python无此担忧了. Python支持**"无限精度"的整数,**一般情况下不用考虑整数溢出的问题,而且Python Int类型与任意精度的Long整数类可以无缝转换,超过Int 范围的情况都将转换成Long类型. 例如: >>> 2899887676637907866*1788778992788348277389943 51872581574157002360341697913

《github一天一道算法题》:搜索二叉树接口实现大合集

读书.思考.写代码! 说明: (1)这里实现了搜索二叉树的全部常用操作 (2)限于时间和精力,实现的较为粗糙,内存泄露.成员变量访问控制.返回类型.异常安全等没有照顾的到 (3)一切实现的手段都是贴近底层操作,关注原理.以后可能对推倒重来,实现一个完备的接口系统. /********************************************* * [email protected] * 题目:二叉树接口实现大合集 * 具体:二叉树的创建.插入.最大值.最小值.前中后序递归遍历与非递

《github一天一道算法题》:并归排序

看书.思考.写代码! /******************************************* * [email protected] * blog: http://blog.csdn.net/hustyangju * 2014-11-04 * 题目:并归排序 * 描述:中分法递归分解一个区间的数组,再合并子区间,在合并时完成排序 * 解题思路:递归法,利用临界条件层层合并 * 时间复杂度:O(n lgn) * 空间复杂度:O(n) * *********************

《github一天一道算法题》:插入排序

看书.思考.写代码! /*********************************************** * [email protected] * blog: http://blog.csdn.net/hustyangju * 2014-11-03 * 题目: 插入排序 * 描述: 给定一个数组,按照逐个插入比较的方法得到一个已序数组 * 解题思路:从第一个元素开始,在已序数组上插入下一个元素,可以从已序数组的尾部,也可以从头部逐个比较插入 * 时间复杂度:原数组顺序排好的情况下

《github一天一道算法题》:动态规划法解决最长公共子序列(LCS)问题的最简单方法

<pre name="code" class="cpp">/* * [email protected] * 问题:longest common subsequece problem * 思路:从底往上,利用动态规划,划分子问题,利用LCS子问题的长度变化,求得LCS * 时间复杂度O(m*n) * 空间复杂度O(m*n) */ #include <iostream> //#include <string> using namesp

《github一天一道算法题》:堆算法接口实现(堆排序、堆插入和堆取最值并删除)

看书.思考.写代码! /********************************************* * [email protected] * blog: http://blog.csdn.net/hustyangju * 题目:堆排序实现,另外实现接口:取堆最大值并删除.堆插入 * 思路:堆是在顺序数组原址上实现的,利用完全二叉树的性质,更具最大堆和最小堆的定义实现的. * 经典应用场景:内存中堆数据管理 * 空间复杂度:堆排序是在原址上实现的,为0 * 时间复杂度:堆排序为O

《github一天一道算法题》:快速排序和随机快速排序

看书.思考.写代码!!! /********************************* * [email protected] * blog: http://blog.csdn.net/hustyangju * 题目:快速排序和随机快速排序 * 思路:采用分治+原址排序,分裂函数将区间分为三个子区间:<=主元.主元和>主元区间,再在主元旁边的两个子区间递归调用排序 * 分裂函数一般将区间最后一个元素作为比较的主元,随机快排则随机选取区间内的一个元素交换到末尾作为主元 * 空间复杂度:原