1. 题目简述
给定一个整形数组 nums 和一个整数 k,其中数组中的数有正有负。请你找到一个最大的子数组的和,并且这个和不能大于 k。
2. 思路
如果是找子数组的和等于 k ,那么就是 LC 的第 560 题:560. 和为 K 的子数组。但是本题要找和不大于 k ,且要最大的。
3. 代码
private int getMaxSubarraySumNoMoreThanK(int[] nums, int k) {
int ans = Integer.MIN_VALUE;
TreeSet<Integer> ts = new TreeSet<>();
ts.add(0);
int preSum = 0;
for (int num : nums) {
preSum += num;
Integer leftPreSum = ts.ceiling(preSum - k);
if (leftPreSum != null) {
ans = Math.max(ans, preSum - leftPreSum);
}
ts.add(preSum);
}
return ans;
}