53. Maximum Subarray-动态规划/分治

15 篇文章 0 订阅
3 篇文章 0 订阅

题:

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.

tags:Dynamic Programming / Divide and Conquer

算法导论上有这题,用分治的方法,O(N*lgN)。

这里我用dp的方法,时间复杂度为O(n)。

遍历数组,累加,当累加的值小于0时,从下一元素开始再从新累加。在这个过程中记录下最大的累加值就可以了。

看代码更容易理解:

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



很高兴回答你的问题!我可以提供一个Java示例代码来说明分治法求最大字段和算法: // Java Implementation of Max Sum Subarray using Divide and Conquer public class MaxSubArraySum { // Function to find the maximum possible sum in arr[] // such that arr[m] is part of it static int maxCrossingSum(int arr[], int l, int m, int h) { // Include elements on left of mid. int sum = 0; int left_sum = Integer.MIN_VALUE; for (int i = m; i >= l; i--) { sum = sum + arr[i]; if (sum > left_sum) left_sum = sum; } // Include elements on right of mid sum = 0; int right_sum = Integer.MIN_VALUE; for (int i = m + 1; i <= h; i++) { sum = sum + arr[i]; if (sum > right_sum) right_sum = sum; } // Return sum of elements on left and right of mid return left_sum + right_sum; } // Returns sum of maxium sum subarray in aa[l..h] static int maxSubArraySum(int arr[], int l, int h) { // Base Case: Only one element if (l == h) return arr[l]; // Find middle point int m = (l + h)/2; /* Return maximum of following three possible cases a) Maximum subarray sum in left half b) Maximum subarray sum in right half c) Maximum subarray sum such that the subarray crosses the midpoint */ return Math.max(Math.max(maxSubArraySum(arr, l, m), maxSubArraySum(arr, m+1, h)), maxCrossingSum(arr, l, m, h)); } /*Driver program to test maxSubArraySum*/ public static void main(String[] args) { int arr[] = {2, 3, 4, 5, 7}; int n = arr.length; int max_sum = maxSubArraySum(arr, 0, n-1); System.out.println("Maximum contiguous sum is "+ max_sum); } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值