动态规划-Maximum Subarray-Maximum Sum Circular Subarray

2020-02-18 20:57:58

一、Maximum Subarray

经典的动态规划问题。

问题描述:

问题求解

    public int maxSubArray(int[] nums) {
        int res = nums[0];
        int n = nums.length;
        int[] dp = new int[n];
        dp[0] = nums[0];
        for (int i = 1; i < n; i++) {
            if (dp[i - 1] < 0) dp[i] = nums[i];
            else dp[i] = dp[i - 1] + nums[i];
            res = Math.max(res, dp[i]);
        }
        return res;
    }

  

二、Maximum Sum Circular Subarray

问题描述:

问题求解:

 

唯一的边界条件是如果全部为负数,那么minsubarray = sum,这个时候直接返回max即可。

    public int maxSubarraySumCircular(int[] A) {
        int n = A.length;
        int sum = 0;
        for (int num : A) sum += num;
        int max = A[0];
        int[] dp = new int[n];
        dp[0] = A[0];
        for (int i = 1; i < n; i++) {
            if (dp[i - 1] < 0) dp[i] = A[i];
            else dp[i] = A[i] + dp[i - 1];
            max = Math.max(max, dp[i]);
        }
        int min = A[0];
        for (int i = 1; i < n; i++) {
            if (dp[i - 1] > 0) dp[i] = A[i];
            else dp[i] = A[i] + dp[i - 1];
            min = Math.min(min, dp[i]);
        }
        return max > 0 ? Math.max(max, sum - min) : max;
    }

  

 

posted @ 2020-02-18 21:03  hyserendipity  阅读(168)  评论(0编辑  收藏  举报