lintcode620- Maximum Subarray IV- medium

本文介绍了一种寻找具有特定长度要求的最大子数组和的算法。该算法使用前缀和的方法来高效地找到满足条件的最大子数组,同时确保结果为整型。

Given an integer arrays, find a contiguous subarray which has the largest sum and length should be greater or equal to given length k.
Return the largest sum, return 0 if there are fewer than k elements in the array.

 Notice

Ensure that the result is an integer type.

Example

Given the array [-2,2,-3,4,-1,2,1,-5,3] and k = 5, the contiguous subarray [2,-3,4,-1,2,1] has the largest sum = 5.

 
前缀法,只是这次preMin是在第一个到第i-k个数内部找而已。还是最大化sum[j] - sum[i],就要求sum[i]一定要最小的。
 
public class Solution {
    /*
     * @param nums: an array of integer
     * @param k: an integer
     * @return: the largest sum
     */
    public int maxSubarray4(int[] nums, int k) {
        // write your code here
        if (nums == null || nums.length == 0 || nums.length < k) {
            return 0;
        }
        
        int[] sums = new int[nums.length];
        sums[0] = nums[0];
        for (int i = 1; i < sums.length; i++) {
            sums[i] = sums[i - 1] + nums[i];
        }
        
        int minPre = 0;
        int maxSum = Integer.MIN_VALUE;
        for (int i = k - 1; i < sums.length; i++) {
            int crtSum = sums[i] - minPre;
            maxSum = Math.max(maxSum, crtSum);
            minPre = Math.min(minPre, sums[i - k + 1]);
        }
        return maxSum;
    }
}

 

 
 

转载于:https://www.cnblogs.com/jasminemzy/p/7818950.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值