求一维数组中,不大于 k 的最大子数组的和

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

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

求一维数组中,不大于 k 的最大子数组的和

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值