📅  最后修改于: 2023-12-03 15:27:34.300000             🧑  作者: Mango
给定一个包含 $n$ 个整数的数组 $nums$,判断其中满足任意两个元素的和都等于第三个元素的三元组数量。
具体地,找到所有的三元组 $(i, j, k)$($0 \leq i, j, k \leq n-1$)满足 $i < j < k$,并且 $nums[i] + nums[j] = nums[k]$。
这是最简单直接的方法,首先枚举三元组的第一个元素 $nums[i]$,再枚举第二个元素 $nums[j]$,最后判断第三个元素 $nums[k]$ 是否存在。
时间复杂度 $O(n^3)$,空间复杂度 $O(1)$。
先将数组排序,然后枚举前两个元素,使用双指针 $left$ 和 $right$ 在剩余元素中查找是否存在满足条件的第三个元素。
时间复杂度 $O(n^2\log n)$,空间复杂度 $O(\log n)$。
使用哈希表记录每个元素出现的次数,然后枚举前两个元素,查找哈希表中是否存在满足条件的第三个元素。
时间复杂度 $O(n^2)$,空间复杂度 $O(n)$。
def count_triples(nums):
n = len(nums)
cnt = 0
for i in range(n):
for j in range(i+1, n):
for k in range(j+1, n):
if nums[i] + nums[j] == nums[k]:
cnt += 1
return cnt
def count_triples(nums):
nums.sort()
n = len(nums)
cnt = 0
for i in range(n-2):
j, k = i+1, n-1
while j < k:
if nums[i] + nums[j] == nums[k]:
cnt += 1
j += 1
k -= 1
elif nums[i] + nums[j] < nums[k]:
j += 1
else:
k -= 1
return cnt
def count_triples(nums):
n = len(nums)
cnt = 0
freq = {}
for x in nums:
freq[x] = freq.get(x, 0) + 1
for i in range(n-1):
for j in range(i+1, n):
if nums[i]+nums[j] in freq and freq[nums[i]+nums[j]] > (nums[i]==nums[j]+nums[i]+nums[j]):
cnt += 1
return cnt
本题的解法有多种,其中双指针和哈希表的方法比暴力枚举更为优化,时间复杂度也更低。
在实际开发中,应选择时间复杂度低且代码简洁易懂的方法。