第一题:给一个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];
}
}