给定一个大小为n的正数数组,从这个数组中挑选尽可能多的项目并乘以—1,这样累积和总是大于0.返回多少项可以作为结果变成负数.

Example:

测试 case 1:[5,3,1,2]

结果= 2

Explanation:

Select 指数1和2并使它们为负值 所以[5,—3,—1,2] 累计总和为[5,2,1,3]

还有其他的可能性,比如[5,-3,1,-2]

我的编码方法是这样的:

static int solve(int[] arr) {
    long sum = 0;
    int result = 0;
    for(int e : arr) {
        int neg = -e;
        if(sum + neg >0) {
            result++;
            sum += neg;
        } else {
            sum += e;
        }
    }
    return result;
} 

但我的方法并不正确,因为它在某些情况下给出了错误的输出,例如:

arr = [5,2,3,5,2,3]

Expected output = 3, my code results = 2

possible solution is [5,-2,3,5,-2,-3]

解决这个问题的正确方法是什么?

推荐答案

如果可能的话,您总是可以try 求反当前元素,同时保持跟踪多集或优先级队列中迄今为止移除的元素.如果当前元素不能从总和中删除,则try 将其替换为先前删除的最大元素(如果后者更大).

static int solve(int[] arr) {
    long sum = 0;
    int result = 0;
    var removed = new PriorityQueue<Integer>(Collections.reverseOrder());
    for (int x : arr) {
        if (sum - x > 0) {
            sum -= x;
            removed.add(x);
            ++result;
        } else if (!removed.isEmpty() && removed.peek() > x) {
            sum += removed.poll() - x;
            removed.add(x);
        } else sum += x;
    }
    return result;
}

Java相关问答推荐

获取拦截器内部的IP地址

Jooq隐式地将bigint转换为数字,并且索引不起作用

伪类focus-in不适用于PFA中的选项卡

Java 22模式匹配不适用于记录模式匹配.给出汇编问题

为什么Java中的两个日期有差异?

Java Swing:初始化身份验证类后未检测到ATM_Interface键事件

什么是Java原子属性的正确getter和setter

带有Health Check的Spring Boot BuildPack打破了本机映像构建过程

使用正则表达式从字符串中提取多个值

X=x*0.90;产生有损转换误差.X*=0.90;不是.为什么?

try 在两个不同数组的数字之间求平均值

对从Spring Boot 3.1.5升级到3.2.0的方法的查询验证失败

如何在字节数组中反转UTF-8编码?

Oracle中从JSON中提取和插入数据

为什么Spring要更改Java版本配置以及如何正确设置?

spring 更新多项管理关系

如何使用stream.allMatch()为空流返回false?

如何使用我的RLE程序解决此问题

如何从指定某些字段的父对象创建子对象

如何在 Android Studio 中删除 ImageView 和屏幕/父级边缘之间的额外空间?