Maximum Subarray

Find the contiguous subarray within an array (containing at least one number) which has the largest sum.

难度:medium

Solution: Dynamic Programming

public class Solution {
    public int maxSubArray(int[] nums) {
        int n = nums.length;
        int[] dp = new int[n];//dp[i] means the maximum subarray ending with A[i];
        dp[0] = nums[0];
        int maxSum = dp[0];

        for(int i = 1; i < n; ++i){
            dp[i] = nums[i] + (dp[i - 1] > 0 ? dp[i - 1] : 0);
            maxSum = Math.max(maxSum, dp[i]);
        }

        return maxSum;
    }
}

更加精简的版本

public class Solution {
    public int maxSubArray(int[] nums) {
        int maxSum = Integer.MIN_VALUE, curSum = 0;
        for(int i = 0; i < nums.length; ++i) {
            curSum += nums[i];
            if(maxSum < curSum) {
                maxSum = curSum;
            }
            if(curSum < 0) {
                curSum = 0;
            }
        }

        return maxSum;
    }
}

Maximum Product Subarray

Find the contiguous subarray within an array (containing at least one number) which has the largest product.

难度:medium

Solution: Dynamic Programming

class Solution {
    public int maxProduct(int[] nums) {
        int pro = nums[0];
        int maxPro = 1;
        int minPro = 1;
        int m = nums.length;
        for(int i = 0; i < m; ++i) {
            if(nums[i] > 0) {
                maxPro = Math.max(maxPro * nums[i], nums[i]);
                minPro = Math.min(minPro * nums[i], nums[i]);
            } else {
                int temp = maxPro;
                maxPro = Math.max(minPro * nums[i], nums[i]);
                minPro = Math.min(temp * nums[i], nums[i]);
            }
            pro = Math.max(maxPro, pro);
        }

        return pro;
    }
}

Minimum Size Subarray Sum

Medium

Given an array of n positive integers and a positive integer s, find the minimal length of a contiguous subarray of which the sum ≥ s. If there isn't one, return 0 instead.

Solution: Two Pointers

class Solution {
    public int minSubArrayLen(int s, int[] nums) {
        int i = 0, j = 0;
        long sum = 0;
        long length = nums.length + 1;
        while(j < nums.length) {
            sum += nums[j];
            while(sum >= s) {
                length = Math.min(length, j - i + 1);
                sum -= nums[i];
                ++i;
            }
            ++j;
        }
        return (int)(length == nums.length + 1 ? 0 : length);
    }
}

results matching ""

    No results matching ""