Maximum Subarray

来源:互联网 发布:淘宝卖家刷单后果 编辑:程序博客网 时间:2024/06/08 00:16

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.

分析题目,题目意思是给定一个数组,设计算法,求出这个数组的最大子序列和,算法设计思路如下:

1.如何获得该数组的子序列

2.如何求的最大和


按照常规思路,对数组的所有子序列进行穷举,然后得出最大和,代码如下:

int maxSubArray(vector<int>& nums) {
int max = nums[0], sum;
for(int i = 0; i < nums.size(); i ++) {
sum = 0;
for(int j = i; j < nums.size(); j ++) {
sum += nums[j];
if(max < sum)
max = sum;
}
}

return max;
}

这种方法因为复杂度太大,运行时显示超时,所以我们采用分治算法来降低算法的复杂度。

分治算法思路如下:

对于这个数组,我们从中间分开,递归求出数组左边最大序列和,递归求出右边序列和,求出跨越边界的序列和,三个和中最大的值即为答案。

算法设计如下;

 void maxSubArray(vector<int>& nums, int left, int right, int& maxs, int& leftMax, int& rightMax, int& sum) {
        if (left == right) {
            maxs = nums[left];
        }
        else {
            int mid = (left + right) / 2;
            int mx1, lmx1, rmx1, sum1;
            int mx2, lmx2, rmx2, sum2;
            maxSubArray(nums, left, maxs, mx1, lmx1, rmx1, sum1);
            maxSubArray(nums, maxs + 1, right, mx2, lmx2, rmx2, sum2);
            maxs = max(max(mx1, mx2), rmx1 + lmx2);
            leftMax = max(lmx1, sum1 + lmx2);
            rightMax = max(rmx2, sum2 + rmx1);
            sum = sum1 + sum2;
        }
    }
    
    int maxSubArray(vector<int>& nums) {
        if (nums.size() == 0) {
            return 0;
        }
        int maxs, leftMax, rightMax, sum;
        maxSubArray(nums, 0, nums.size() - 1, maxs, leftMax, rightMax, sum);
        return maxs;
    }


原创粉丝点击