【问题标题】:Max row sum in an array with all negative numbers具有所有负数的数组中的最大行总和
【发布时间】:2017-06-22 08:21:44
【问题描述】:

当每行的所有rowSum 值都是正数时,下面的代码工作正常,但如果所有rowSum 值都是负数(检查负数>0 并且每次都失败)并给出答案为 0,则它会失败。请建议处理这种负数情况的东西。 maxSum 应该用什么初始化?

public static void findMaxRow(double[][] a){  
double maxSum = 0;
int maxRow = 0;

for (int row = 0; row < a.length; row++){

    double rowSum = 0;

    for (int column = 0; column < a[row].length; column++){
        rowSum += a[row][column];
    }

    if (rowSum > maxSum){
        maxSum = rowSum;
        maxRow = row;
    }
}}}

【问题讨论】:

  • 好吧,如果它们都是负数,它们的总和是多少?这个总和是否大于maxSum

标签: java arrays logic


【解决方案1】:

你的初始值

double maxSum = 0;

如果实际最大值为负,则导致 maxSum 保持 0。

将初始值改为Double.NEGATIVE_INFINITY

double maxSum = Double.NEGATIVE_INFINITY;

【讨论】:

  • 是的,这行得通,但我讨厌这样做:这很粗糙。不过个人意见和你的方法在 Java 中得到了完美的定义,它要求 IEEE754 用于double;投赞成票。
  • 这行得通。谢谢。在接受之前,我仍然会等待更多建议。
【解决方案2】:

您的算法失败,因为包含至少一个负数的一组数字的总和可能低于零。

一种稳健的方法是将计算行总和的函数部分拆分为函数rowSum 说。

然后,在调用站点,您可以将maxSum 初始化为第一行的总和,然后在for 循环中继续处理其他行。您还可以根据具体要求有效处理零行情况。

另一种方法是将maxSum 的类型更改为Double,并将其初始化为null,并调整将新总和与maxSum 中的当前值进行比较的代码。这种方式非常优雅地处理了行数为零的情况。

【讨论】:

  • 为此,需要单独计算第一行的总和对吗?这不会是开销吗?
  • 一点也不:您不会多次评估任何行的总和。
猜你喜欢
  • 1970-01-01
  • 2023-01-25
  • 1970-01-01
  • 2015-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
相关资源
最近更新 更多