在数组中求子数组的累加和是小于等于K的,并且是最大的,返回这个最大的累加和。

问题描述:

        在数组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;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值