Leetcode[53]分治算法求解最长子串和问题

来源:互联网 发布:get it beauty2016 编辑:程序博客网 时间:2024/06/17 04:15

问题描述:找到一个数组的最长连续子串和问题。

       例如:Input:[-2,1,-3,4,-1,2,1,-5,4]  Output:[4,-1,2,1] maxSum=6;

问题思考: 

              思路1:暴力求解  

for(int i=0;i<length-1;i++){for(int j=i;j<length;j++){  sum=Num[i]+....Num[j]; max=max>sum?max:sum;}}
            该算法简单易懂,但是往往时间消耗比较大

        思路2:分治算法

divide:将串平均分为两段,如下代码第6行。分别处理两个子串,并拼接计算。
conquer: 计算1.自身包含左端的最大子串;2.包含右端的最大子串;(这两个子串用于与其他子串拼接);3.自身的最大子串。

class Solution {public:    int MaxSubSum(vector<int>& a,int left,int right){        int sum=0;        if(left>right) return 0;        if(left==right){            sum=a[left]>a[right]?a[left]:a[right];            return sum;        }        int leftSum=MaxSubSum(a,left,(left+right)/2);        int rightSum=MaxSubSum(a,1+(left+right)/2,right);        int s1,sum1=0,sum2=0,s2,n=right-left+1;        s1=a[left+n/2-1];        s2=a[left+n/2];        for(int i=left+n/2-1;i>=left;i--){            sum+=a[i];            if(sum1>s1) s1=sum1;        }        for(int i=left+n/2;i<=right;i++){            sum2+=a[i];            if(sum2>s2) s2=sum2;        }        sum=s1+s2;        sum=sum>leftSum?sum:leftSum;        sum=sum>rightSum?sum:rightSum;        return sum;            }    int maxSubArray(vector<int>& nums) {        return MaxSubSum(nums,0,nums.size()-1);    }};


0 0
原创粉丝点击