通过多个 FOR 循环提高时间复杂度的最佳方法是什么



我正在尝试求解 this hackerrank java中的问题,我输出了正确的值,但是我并不是通过所有传递所有由于超时(当输入大量输入时)进行测试,因为我最终有 7" for" loops ..您可以建议您使用编程的新建议,是什么是减少这些循环的最佳方法。循环执行以下操作:

循环1:将每个空间的输入分配并将每个值分配给字符串数组
循环2:将字符串转换为int并将每个int值分配给数组的int版本,以允许计算
循环3:重复循环1,但此时间用于查询输入
循环4:重复循环2,但是这次是查询输入
循环5:外环遍历每个Q
环6:环路5的内环1遍历每个数组值并用Curr查询值概括curr值
循环7:环路5的内环2遍历更新的数组值,并首先获取其绝对值

来总结它们

so ..在如此多的循环之后,复杂性是一场灾难。有什么想法如何改善它?

时间复杂性主要取决于最后一个嵌套循环。在所有查询和整个数组上进行迭代是100000 * 100000 = 10000000000迭代,这太多了。您需要迭代这两个阵列,但不要以嵌套的方式进行迭代。您只能对任何查询中的log(100000)迭代进行处理。问题页面暗示了对数的二进制搜索,因此应该这样做。

样品输入是带有查询[1, -2, 3][-1, 2, -3]的数组。

数组可以按任何顺序进行,因此您可以从对数组进行排序以获取[-3, -1, 2]

使用第一个查询1,我们获得了数组[-2, 0, 3]。这里没有足够的时间来迭代此处的数组,因此请考虑答案与初始数组有何不同:

  • 2已更改为3,因此总和增加了1。保持积极的任何数字都会有相同的增加。

  • -3已更改为-2,因此总和减少了1。任何保持负数的数字都会有相同的减少。

  • -1已更改为0,因此总和减少了1。这与上述类似。

  • 这里没有任何数字改变他们的标志,但也检查他们会发生什么。如果对数组进行排序,则它们将在数组中都相邻值。在这里,它有助于了解原始数组中任何值范围的总和。这些可以通过存储数组的每个前缀的总和来预先计算。

请注意,如果所有数字一开始就可以更容易,因此您可以将问题转换为[2, 5, 0]和查询[-3, 1, -2, 3]的数组,然后不要输出第一个答案。 <</em>

我们知道原始数组的总和是6,因此新总和为6 + 1 - 1 - 1 = 5。如果我们知道有多少个数字是正或负面的(尝试二进制搜索),以及它们如何适合上面的情况,那么每个总和只是几个乘法,加法和减法。

相关内容

最新更新