LeetCode || Maximum Subarray

来源:互联网 发布:网络诈骗 编辑:程序博客网 时间:2024/06/05 21:49

Maximum Subarray

 Total Accepted: 12325 Total Submissions: 37953My Submissions

Find the contiguous subarray within an array (containing at least one number) which has the largest sum.

For example, given the array [−2,1,−3,4,−1,2,1,−5,4],
the contiguous subarray [4,−1,2,1] has the largest sum = 6.

click to show more practice.

看完这题,O(n)的方法没想出来(O(n)是最快的方法了),于是只能去看了下Discuss里面大家的讨论,看到一个简洁的 O(n)方法,于是学来,思路是用一个临时变量 cur_sum 存储当前的和,遍历 A[],一旦遇到 cur_sum <0 ,就令cur_sum=A[i],接下来再判断 sum<cur_sum 是否成立,如果成立就令 sum=cur_sum。代码如下:

class Solution {public:    int maxSubArray(int A[], int n) {        int sum=A[0], cur_sum=INT_MIN;        for(int i=0; i<n; ++i){            if(cur_sum<0)                cur_sum=A[i];            else                cur_sum+=A[i];            if(sum<cur_sum)                sum=cur_sum;                    }        return sum;    }};


注意:sum=A[0] 是为了避免A中只有一个元素的情况,cur_sum的初始值应该为 int_min,防止 sum<cur_sum 在不该成立时成立。

题目最后提到了分治法解决会很巧妙,于是在Discuss里看到某大神的分治法讲解。思路如下:
    1、单独写一个计算函数,首先计算middle索引,递归调用本函数计算(left,middle-1)和(middle+1,right);
    2、针对middle处的元素,一共有两种情况:最终的sum不包含它/包含它。
    3、从middle开始,向left方向走,计算出此方向上的最大和;然后从middle向right方向走,计算出最大和;将二者加和就是包含middle值的最大和;
    4、比较包含middle的最大和与1中计算出的middle左侧、右侧最大和,返回其中的最大值即可。

    复杂度:T(n)=2T(n/2)+n, 为O(n*lgn)。不如 O(n)的快。



0 0
原创粉丝点击