繁体   English   中英

在二维数组的一行中查找所需的总和java

[英]Finding the desired sum in a row of a 2d array java

我无法围绕如何实现一个方法开始到总和。 例如,如果输入数组是

int[][] input = new int[][]{
{3,4,4,2,7},
{2,3,2,8,6},
{1,4,2,1,2}
}

当总和设置为 7 时,它将产生一个具有以下值的输出数组

{3,4,0,0,7},
{2,3,2,0,0},
{1,4,2,1,0}
}

输出数组应该只显示与它们的邻居相加等于一组数字 (7) 的值,或者如果它是 0-9 值之间的数字是所需的总和(当您搜索 7 时,它会显示所有 7)。 为了进一步澄清,正如您在输出数组中看到的那样,它显示前两个值 3 和 4,因为它们与 7 相加。它显示 2,3,2,因为它们与 7 相加。它打印出 1,4 ,2,1 在底部,因为 1,4,2 加到 7 和 4,2,1 加到 7。总而言之,它只显示 7 或加起来为 7 的值,旁边是数字,否则显示 0。而且输入值必须 <0。

经过一段时间的头脑风暴,我知道代码将需要许多嵌套循环:一个循环遍历行,在那个循环中循环遍历列,在那个循环中更新总和,当总和等于预设时停止sum(在这种情况下为 7),最后是一个循环来更新输出 [][]。 但是,我在编写正确实现所有这些循环的代码时遇到了很多麻烦。 我打算对垂直相加的数字做同样的事情,但现在想专注于水平。

您需要三个嵌套循环。 或者真的,三层嵌套循环,最内层有两个循环,但我最后会回到那个。

在任何循环之前,创建结果数组的主干。 如果此时它是对数组的空引用的数组,那也没关系。

外循环:循环遍历外数组。 经典的for循环是一种选择。 对于每个条目,在结果中创建一个长度正确的内部数组,开始时填充零。

中间循环,循环遍历内部数组中的条目。 同样,经典的for循环很好。 您的目标是每次迭代将确定一系列总和为 7 的相邻值是否从该条目开始,如果是,找出它的长度,并将有问题的条目复制到结果数组中。

内循环(即第一个内循环)用于添加相邻条目以找出总和是否为 7。您从中间循环的条目开始并将值相加。 这个循环有一个双重停止条件:当总和为 7 或更大时停止(假设所有值都是正的),但很明显,当到达内部数组的末尾时也会停止。 while循环符合我的口味。 仅当总和恰好达到 7 时,才使用新的内部循环将值复制到结果中。

PS 如果你假设所有的值都是正的,你不应该只是假设,你应该检查。 在中间循环中,如果该条目中的值为 0 或负数,则抛出IllegalArgumentException

这可以以 O(NxM) 的复杂度完成。

对于每一行,您保留两个索引(例如,iLow 和 iHigh 初始化为第一个项目输入 [i][0])和一个 sumSoFar 变量。 在每次迭代中,如果 sumSoFar < 7,则增加 iHigh。 如果它 > 7,则增加 iLow 和 iHigh。 如果它是 == 7,那么您已经找到了一种组合 + 增量 iLow 和 iHigh。

这应该给出算法的高级概念,我确信很多细节都缺失/不完整,但您应该能够将其放入代码中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM