小于等于K的最大子数组累加和

简介: 小于等于K的最大子数组累加和

题目

请返回arr中,求子数组的累加和,是<=K的并且是最大的
返回这个最大的累加和

解题思路

假设0~ 57整体累加和1000,求< =300的累加和怎么最大
其实就是求之前有哪个前缀和是>=700且最接近

1)0-0看有没有>=700的前缀和,没有,前缀和为40
2)0-1看有没有>=700的前缀和,没有,前缀和为100
3)0-2看有没有>=700的前缀和,没有,前缀和为70
...
n)0-23前缀和为710
即24-57的累加和为小于等于300最大的累加和

用有序表存储数据,可以拿到离700最近的数字

代码

public static int getMaxLessOrEqualK(int[] arr, int K) {
    // 记录i之前的,前缀和,按照有序表组织
    TreeSet<Integer> set = new TreeSet<Integer>();
    // 一个数也没有的时候,就已经有一个前缀和是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]; // sum -> arr[0..i];
        if (set.ceiling(sum - K) != null) {
            max = Math.max(max, sum - set.ceiling(sum - K));
        }
        set.add(sum); // 当前的前缀和加入到set中去
    }
    return max;

}
相关文章
|
6月前
|
算法 前端开发
最大公因数等于 K 的子数组数目
最大公因数等于 K 的子数组数目
51 0
|
5月前
数组\判断是否能被已知且小于x的素数整除
数组\判断是否能被已知且小于x的素数整除
26 0
|
6月前
|
算法 测试技术 C#
【最大公约数 调和级数】2183.统计可以被 K 整除的下标对数目
【最大公约数 调和级数】2183.统计可以被 K 整除的下标对数目
|
6月前
|
算法 Java 测试技术
连号区间数
连号区间数
57 0
判断数的奇偶性
判断数的奇偶性
96 0
|
索引
三个数的最大乘积
三个数的最大乘积
69 0
|
Python
找几个数的最大乘积
找几个数的最大乘积
74 0
|
机器学习/深度学习
欧拉函数:求小于等于n且与n互质的数的个数
求小于等于n且与n互质的数的个数 互质穷举法 互质:两个数互质代表两者最大公约数为1 最大公约数求法:辗转相除法,最小公倍数:较大值除以最大公约数乘以较小值 辗转相除法: 较大的数a取模较小的数b,得取模值c 若取模值等于0 则最大公约数为取模值,否则继续下一步 a与c再次取模,回到第二步 //求最大公约数gcd以及最大公倍数lcm // 36 24 36/24 // 24 12 24/12 // 0 结束最大公约数为12 // 求最小公倍数 // lcm(a, b) = (a * b)/g
139 0
|
机器学习/深度学习
1210. 连号区间数
1210. 连号区间数
88 0