Maximum Subarray问题及解法

    xiaoxiao2021-03-25  66

    问题描述:

    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.将一个数组分为三个部分:left,mid,right;

    2.求解问题的答案会出现在left部分或者right部分或者mid和left、right的组合部分;

    3.分别求出三个部分的最大值进行比较即可,依次递归

    下面是分治法代码:

    class Solution { public: int maxSubArray(vector<int>& nums) { return maxRes(nums,0,nums.size() - 1); } int maxRes(vector<int>& nums,int l,int h) { if(l >= h) return nums[l]; int mid = (l + h) / 2; int left = maxRes(nums,l,mid - 1); int right = maxRes(nums,mid + 1,h); int sum = 0; int ls = INT_MIN; for(int i = mid - 1;i >= l; i--) { sum += nums[i]; ls = max(sum,ls); } if(ls == INT_MIN) ls = 0; sum = 0; int rs = INT_MIN; for(int i = mid + 1;i <= h; i++) { sum += nums[i]; rs = max(sum,rs); } if(rs == INT_MIN) rs = 0; sum = max(max(ls + nums[mid],nums[mid]),max(nums[mid] + rs,nums[mid] + rs + ls)); return max(max(left,right),sum); } };

    贪心如下:

    class Solution { public: int maxSubArray(vector<int>& A, int n) { int sum = 0, min = 0, res = A[0]; for(int i = 0; i < n; i++) { sum += A[i]; if(sum - min > res) res = sum - min; if(sum < min) min = sum; } return res; } };

    动态规划如下:

    public int maxSubArray(vector<int>& A) { int n = A.length; int[] dp = new int[n];//dp[i] 代表以 A[i]结尾的子数组最大和; dp[0] = A[0]; int max = dp[0]; for(int i = 1; i < n; i++){ dp[i] = A[i] + (dp[i - 1] > 0 ? dp[i - 1] : 0); max = Math.max(max, dp[i]); } return max; }

    好了,有不懂的欢迎交流哈~~~

    转载请注明原文地址: https://ju.6miu.com/read-33173.html

    最新回复(0)