给出一个时间复杂度低于O(n^2)的算法
时间: 2023-07-24 21:12:23 浏览: 138
设双链表表示的线性表L=(a1,a2,……,an),试写一时间复杂度为O(n)的算法,将L改造为L=(a1,a3,……,an,……,a4,a2)。
我们可以把问题转化为计算所有可能的 ai/aj 值,然后检查是否存在与之匹配的 bi/bj 值。我们可以使用哈希表来存储所有可能的 ai/aj 值,然后遍历所有可能的 bi/bj 值,并在哈希表中查找是否存在与之匹配的 ai/aj 值。
以下是代码实现:
```python
def count_pairs(a, b):
n = len(a)
ratios = {}
for i in range(n):
for j in range(i+1, n):
if a[j] != 0:
ratio = a[i] / a[j]
if ratio not in ratios:
ratios[ratio] = []
ratios[ratio].append((i, j))
pair_count = 0
for i in range(n):
for j in range(i+1, n):
if b[j] != 0:
ratio = b[i] / b[j]
if ratio in ratios:
for pair in ratios[ratio]:
if i < pair[0] and j < pair[1]:
pair_count += 1
return pair_count
```
这个解法的时间复杂度是 O(n^2),但是实际运行时间会比预处理所有可能的 ai*aj 值的解法要快。我们只预处理了所有可能的 ai/aj 值,所以哈希表的大小是 O(n^2)。
阅读全文