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;
}
本文介绍了如何解决寻找一个一维数组中,和不大于k的最大子数组的问题。不同于求等于k的子数组,此题需要找到最大的符合条件的子数组。解决方案采用滑动窗口的思想,通过TreeSet来存储前缀和,找到当前前缀和所能得到的最大子数组和。代码中展示了具体实现过程。
5万+

被折叠的 条评论
为什么被折叠?



