2023-08-29力扣每日一题

链接:

823. 带因子的二叉树

题意:

用给的数字建二叉树,要求父节点是子节点的乘积

解:

乐了

1500ms+30MB //注释版120ms+18MB

实际代码:

#include<bits/stdc++.h>
using namespace std;
static constexpr int Mod=1E9+7;
int numFactoredBinaryTrees(vector<int>& arr)
{
    map<int,int>mp;
    for(auto ar:arr) mp[ar]=1;

    //set<int>st(arr.begin(),arr.end());
    //int lg=st.size();
    long long ret=0;
    map<int,long long>dp;

    //for(auto s1:st)
    for(auto mp1:mp)
    {
        dp[mp1.first]=1;
        for(auto mp2:mp)
        {
            if(mp2.first==mp1.first) break;
            if(mp1.first%mp2.first==0 && mp[mp1.first/mp2.first]>0)
            {
                //cout<<s2<<"&"<<s1/s2<<endl;
                dp[mp1.first]+=dp[mp2.first]*dp[mp1.first/mp2.first];
                dp[mp1.first]%=Mod;
            }
        }
        //cout<<s1<<" "<<dp[s1]<<endl;
        ret+=dp[mp1.first];
        ret%=Mod;
    }

    return ret;
}
/*
int numFactoredBinaryTrees(vector<int>& arr)
{
    map<int,int>mp;
    for(auto ar:arr) mp[ar]=1;

    set<int>st(arr.begin(),arr.end());
    int lg=st.size();
    long long ret=0;
    map<int,long long>dp;
    
    for(auto s1:st)
    {
        dp[s1]=1;
        for(auto s2:st)
        {
            if(s2==s1) break;
            if(s1%s2==0 && mp[s1/s2]>0)
            {
                //cout<<s2<<"&"<<s1/s2<<endl;
                if(s2==s1/s2) dp[s1]+=dp[s2]*dp[s2];
                else dp[s1]+=dp[s2]*dp[s1/s2];
                dp[s1]%=Mod;
            }
        }
        //cout<<s1<<" "<<dp[s1]<<endl;
        ret+=dp[s1];
        ret%=Mod;
    }
    
    return ret;
}*/

int main()
{
    vector<int>in;int temp;
    while(cin>>temp)in.push_back(temp);
    int ans=numFactoredBinaryTrees(in);
    cout<<ans<<endl;
    
    return ans;
}

限制:

  • 1 <= arr.length <= 1000
  • 2 <= arr[i] <= 109
  • arr 中的所有值 互不相同
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值