leetcode-1726同积元组

1. 题目

在这里插入图片描述
留意:

  1. 一组数据可以组成8个满足条件的元组
  2. 结合排序!!! 很关键

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])

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值