1. 题目
留意:
- 一组数据可以组成8个满足条件的元组
- 结合排序!!! 很关键
2. 解决方法:
1. 排序 + dfs得到数据的排列组合
class Solution:
def isSatisitfy(self, num):
if num[0]*num[3] == num[2]*num[1]:
return True
else:
return False
def tupleSameProduct(self, nums: List[int]) -> int:
sort_nums = sorted(nums)
result = set()
def dfs(j, res):
if len(res) + len(nums)-j<4:
return
if len(res)==4:
if self.isSatisitfy(res):
result.add(tuple(res))
return
for i in range(j,len(sort_nums)):
dfs(i+1, res+[sort_nums[i]])
dfs(0,[])
return len(result)*8
严重超时。。。
2. 排序+查找:
class Solution:
def tupleSameProduct(self, nums: List[int]) -> int:
sort_nums = sorted(nums)
res = 0
n = len(nums)
for i in range(n-3):
for j in range(i+3,n):
x = sort_nums[i] *sort_nums[j]
p = i+1
q =j-1
while p<q:
y = sort_nums[p]*sort_nums[q]
if x==y:
res+=1
p+=1
q-=1
elif x<y:
q-=1
else:
p+=1
return res<<3
先固定好两边的数,求得两个数的积,再从两个端点向中间查找,查找满足条件的组合。
额,,python代码超时
3.排序+map
import collections
class Solution:
def tupleSameProduct(self, nums: List[int]) -> int:
sort_nums = sorted(nums)
res = 0
n = len(nums)
dicta = collections.defaultdict()
for i in range(n-1):
for j in range(i+1,n):
x = sort_nums[i] *sort_nums[j]
if x not in dicta:
dicta[x] = 1
else:
res += dicta[x]
dicta[x] +=1
return res<<3
巧妙的运用map记录元素的积的个数,key:两数之积,val:次数。
留意到,同一个key中每增加一组元素,结果加上原来的次数。
比如 a:2 然后增加一组元素,则总加的总元组的个数为: 增加 2 (dicta[a])