我有一个使用两个循环的幼稚解决方案,但我想将时间复杂度提高为O(nlogn)。有更好的方法吗?
该数组未排序,并且也可以具有负值。
样本测试用例: 数组:1 0 3 2
输出: 4
说明: 索引-(0,1),(0,3),(1,2),(2,3)是满足给定约束的对。
答案 0 :(得分:1)
问题:find (i,j), i<j, s.t. a[i] + a[j] = i + j
我提出以下方法:
设置b[i] = a[i] - i
问题变成:find (i,j), i<j, s.t. b[i] + b[j] = 0
复杂度:O(n)
在std :: vector(或std :: array)中创建对象c[i] = (b[i],i)
(例如,结构)
复杂度:O(n)
根据c[i]
值对b
对进行排序->获取d[j] = (v[j], i[j])
,对数组进行排序
复杂度:O(nlogn)
找到所有对j,k
,使v[j] = -v[k]
复杂性:要排序的数组应为O(n)
保管案件i[j] < i[k]
复杂度:O(n)