max sub sum II

本文介绍了如何使用滑动窗口算法解决两个具体问题:一是寻找数组中指定长度的连续子数组的最大和;二是寻找数组中三个不重叠的指定长度子数组,使它们的和最大。通过Java代码实现并提供了具体的例子进行验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一题:给一个array,给一个数字n,找出n个连续数字which和最大。

第二题:给一个array,给一个数字n,找出3个不overlap的n个连续数字使得和最大,比如说给 1 3 7 7 2 1 1 4 8 8 6 1 1 9,结果就是1 3 (7 7) 2 1 1 (4 8) (8 6) 1 1 9,输出他们的和。

import java.util.*;

public class MaxSubSumII {

	//http://www.1point3acres.com/bbs/forum.php?mod=viewthread&tid=178592&extra=page%3D3%26filter%3Dsortid%26sortid%3D311%26searchoption%255B3046%255D%255Bvalue%255D%3D2%26searchoption%255B3046%255D%255Btype%255D%3Dradio&page=1
	public static void main(String[] args) {
		MaxSubSumII window = new MaxSubSumII();
        int[] nums1 = new int[] {1,3,7,7,2,1,1,4,8,8,6,1,1,9};
        int n = 2, k = 3;
        System.out.println(window.getMaxValue(nums1, n, k) == 40);
        int[] nums2 = new int[] {1,-3,7,7,-2,1,-1,4,-8,8,-6,1,1,9};
        System.out.println(window.getMaxSumKElements(nums2, 3));
}

	
	public int getMaxSumKElements(int[] nums, int k) {
		if (nums.length < k) {
			return -1;
		}
		int curMax = 0, curSum = 0;
		Queue<Integer> queue = new LinkedList<>();
		for (int i = 0; i < k; i++) {
			queue.offer(nums[i]);
			curSum += nums[i];
		}
		curMax = curSum;
		for (int i = k; i < nums.length; i++) {
			curSum = curSum - queue.poll();
			curSum = curSum + nums[i];
			queue.offer(nums[i]);
			curMax = Math.max(curSum, curMax);
		}
		return curMax;
	}
	
	
	public int getMaxValue(int[] nums, int n, int k) {
		int len = nums.length;
		int[] sum = new int[len];
		for (int i = 0; i < len; i++) {
			sum[i] = (i == 0 ? 0 : sum[i - 1]) + nums[i];
		}
		if (len <= n * k)
			return sum[len - 1];
		// ask interviewer if the method should return 0 when len < n*k
		int[] prev = new int[len + 1];
		for (int i = 1; i <= k; i++) {
			int[] dp = new int[len + 1];
			for (int j = i * n; j <= len; j++) {
				if (j == i * n)
					dp[j] = sum[j - 1];
				else
					dp[j] = Math.max(dp[j - 1], sum[j - 1] - sum[j - n - 1] + prev[j - n]);
			}
			prev = dp;
		}
		return prev[len];
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值