在一个数组中找到(i,j)对的总数,使得i <j和=“” a [i] + a [j] =“ i + j。

时间:2018-11-16 18:27:32

标签: c++ logic

=“ “

我有一个使用两个循环的幼稚解决方案,但我想将时间复杂度提高为O(nlogn)。有更好的方法吗?

该数组未排序,并且也可以具有负值。

样本测试用例: 数组:1 0 3 2

输出: 4

说明: 索引-(0,1),(0,3),(1,2),(2,3)是满足给定约束的对。

1 个答案:

答案 0 :(得分:1)

问题:find (i,j), i<j, s.t. a[i] + a[j] = i + j

我提出以下方法:

  1. 设置b[i] = a[i] - i
    问题变成:find (i,j), i<j, s.t. b[i] + b[j] = 0
    复杂度:O(n)

  2. 在std :: vector(或std :: array)中创建对象c[i] = (b[i],i)(例如,结构)
    复杂度:O(n)

  3. 根据c[i]值对b对进行排序->获取d[j] = (v[j], i[j]),对数组进行排序
    复杂度:O(nlogn)

  4. 找到所有对j,k,使v[j] = -v[k]
    复杂性:要排序的数组应为O(n)

  5. 保管案件i[j] < i[k]
    复杂度:O(n)