数组元素总和的索引总和(优化)

时间:2018-11-19 09:01:42

标签: java python algorithm optimization

您开始没有。元素N假设N,您将得到N个数字,在下一行有一个空格。确定该数组中的个案数,使其遵循以下规则-structureblock,STRUCTURE_BLOCK structurevoid,STRUCTURE_VOID sugar,SUGAR sugarcane,SUGAR_CANE reeds,SUGAR_CANE scane,SUGAR_CANE reed,SUGAR_CANE sunflower,SUNFLOWER sugarcane,SUNFLOWER tallgrass,TALL_GRASS tgrass,TALL_GRASS longgrass,TALL_GRASS wildgrass,TALL_GRASS lgrass,TALL_GRASS tgrass,TALL_SEAGRASS tseagrass,TALL_SEAGRASS lseagrass,TALL_SEAGRASS sugar,TERRACOTTA hardclay,TERRACOTTA ,其中i和j是索引,i+j=array[i]+array[j]

例如, 输入-

i<j

输出-

5
1 0 2 4 3

说明-

4

现在,我可以使用O(n * n)遍历所有元素来解决它。您能提出优化的代码吗??

我在python中的代码如下:

Elements of array at index (0,1), (1,3), (3,4) and (0,4) follows the above rule

我在Java中的代码(摘要)如下:

n=int(input())
arr=list(map(int,input.split(' ')))
count=0
for i in range(n):
    for j in range(i+1,n):
        if(i+j==arr[i]+arr[j]):
            count+=1
print(count)

1 个答案:

答案 0 :(得分:1)

首先请注意条件i+j=array[i]+array[j]等同于:

(array[i] - i) + (array[j] -- j) == 0

因此,为每个array[i] - i计算i。在您的示例中,您将获得[1, -1, 0, 1, -1]编辑:多亏了maaartinus的评论,因为只要求成对计数,所以我们也只需要对每个计算出的差异进行计数。因此,对于每个差异,请以正差异的形式存储多少次,以负数的形式存储多少次。使用以计算出的差异为关键的地图:

   0 -> 1 occrurrence (index 2)
   1 -> 2 negative occurrences (indices 1, 4), 2 positive occurrences (indices 0, 3).

未存储具体索引,我仅将其包括在内作为说明。并且不要存储0条目。由于i < j的限制,我们无法将其用于任何用途。因此,在您的示例情况下,我们只有:

   1 -> 2 negative occurrences, 2 positive occurrences

现在,通过将条目中的每个索引与键-n以及条目n中的每个索引进行组合,可以实现我们的目标。我们需要对每一对进行排序,以便满足其他条件i < j。由于相同的索引不会同时被视为正数和负数,因此这始终是可能的。因此,地图条目n中的对数是负次数和正次数两次计数的乘积。在您的情况下,您只有一个n,在其他情况下,可能会很多,因此将所有对的数目加在一起。在示例中,我们只有2 * 2 = 4对。这个结果与您的问题相符。

编辑:复杂性考虑:我方法的复杂性取决于映射操作的复杂性,而映射操作的复杂性又取决于您选择的映射实现。对于大多数地图实现,地图的构建将是耗时的部分,并且将花费O(n *地图查找成本)。假设在HashMap中的查找介于线性和O(log n)之间,则可以得到O(n)和O(n * log n)之间的某个值。在任何情况下都比O(n ^ 2)好。

快乐的编码。

我的原始想法

我最初的想法是生成所有对。这个想法可能更容易理解,所以我让它站在这里。但是,它的性能并不比O(n ^ 2)好。

将索引存储到多图或列表图中,其中计算出的差异为键。在示例中,您将获得

  -1 -> 1, 4
   0 -> 2
   1 -> 0, 3

现在,通过将条目中的每个索引与键-n以及条目n中的每个索引进行组合,可以实现我们的目标。只有我们需要对每一对进行排序,以便满足其他条件i < j(这总是可能的,因为相同的索引不会出现在两个列表中)。

未排序对:

(1, 0), (1, 3), (4, 0), (4, 3)

排序对(即i < j):

(0, 1), (1, 3), (0, 4), (3, 4)

为进行比较,更正您自己的代码后会产生:

(0, 1), (0, 4), (1, 3), (3, 4)

它们是相同的4对,只是顺序不同。排序将解决问题,