问题描述:
在数组arr中求子数组的累加和是小于等于K的,并且是最大的,返回这个最大的累加和。
思想:
看到关于子数组的问题,我们首先的思路是遍历数组的每一个位置作为子数组的结尾位置,依次求出每个位置的前缀和,我们就可以方便的求出子数组的累加和。
代码:
public static int getMaxLessOrEqualK(int[] arr, int K) {
//记录i之前的前缀和,按照有序表组织
TreeSet<Integer> set = new TreeSet<>();
//一个数也没有的时候,就已经有一个前缀和是0了
set.add(0);
int max = Integer.MIN_VALUE;
int sum = 0;
//每一步的i,都求子数组必须以i结尾的情况下,求子数组的累加和是<=k,并且是最大的
for (int i = 0; i < arr.length; i++) {
sum += arr[i];
if (set.ceiling(sum - K) != null) {
max = Math.max(max, sum - set.ceiling(sum - K));
}
//当前的前缀和加入到set中
set.add(sum);
}
return max;
}