LeetCode学习篇二十七——Maximum Subarray

来源:互联网 发布:网络监测软件 编辑:程序博客网 时间:2024/06/05 10:33

题目: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.
难度:medium

解法一:动态规划(遍历数组全局最优和局部最优)

class Solution {public:    int maxSubArray(vector<int>& nums) {        if(nums.size() == 0) {            return 0;        }        int maxi = INT_MIN;        int temp = 0;        for(int i = 0; i < nums.size(); i++) {            if(temp < 0 )  temp = 0;            temp += nums[i];            maxi = max(temp, maxi);        }        return maxi;    }};

解法二:二分法
最大和子序列不是在左边的子序列,就是右边的子序列,或者中间的子序列

class Solution {public:    int maxSum(vector<int> & nums, int l, int r) {        if (l == r) return nums[l];        int mid = (l + r) / 2;        int maxLeft = maxSum(nums, l, mid);        int maxRight = maxSum(nums, mid + 1, r);        int tL = 0, tR = 0;        int maxL = INT_MIN, maxR = INT_MIN;        for (int i = mid; i >= l; i--) {            tL += nums[i];            if (tL > maxL) maxL = tL;        }        for (int i = mid + 1; i <= r; i++) {            tR += nums[i];            if (tR > maxR) maxR = tR;        }        return maxLeft > maxRight ? (maxLeft > (maxL + maxR) ? maxLeft : (maxL + maxR)) : (maxRight > (maxL + maxR) ? maxRight : (maxL + maxR));    }    int maxSubArray(vector<int>& nums) {        return maxSum(nums, 0, nums.size() - 1);    }};
0 0
原创粉丝点击