leetcode------996. 正方形数组的数目,map【1】

 https://leetcode-cn.com/problems/number-of-squareful-arrays/

给定一个非负整数数组 A,如果该数组每对相邻元素之和是一个完全平方数,则称这一数组为正方形数组。

返回 A 的正方形排列的数目。两个排列 A1 和 A2 不同的充要条件是存在某个索引 i,使得 A1[i] != A2[i]。

示例 1:

输入:[1,17,8]
输出:2
解释:
[1,8,17] 和 [17,8,1] 都是有效的排列。

示例 2:

输入:[2,2,2]
输出:1

下面的这个是非常高效的dfs,是将A中元素先归类(相同元素放在一个篮子里),然后从不同篮子里面取,遇到有很多相同元素的情况,简直牛! 击败了100%代码

class Solution {
    public:
        int n=13;
        map<int,int> mp;
        int dp[13][13];
        int res=0;
        int numSquarefulPerms(vector<int>& A) {
            n=A.size();
            for(int i=0; i<n; i++)
            {
                if(mp.count(A[i])==0)
                    mp[A[i]]=1;
                else
                    mp[A[i]]++;
            }
            map<int,int>::iterator it1,it2;
            for(it1=mp.begin(); it1!=mp.end(); it1++)
            {
                for(it2=it1; it2!=mp.end(); it2++)
                    if(isSquare(it1->first+it2->first))
                    {
                        int k1=distance(mp.begin(),it1);
                        int k2=distance(mp.begin(),it2);
                        //cout<<k1<<" "<<k2<<endl;
                        dp[k1][k2]=1;
                        dp[k2][k1]=1;

                    }

            }
            for(it1=mp.begin(); it1!=mp.end(); it1++)
            {
                mp[it1->first]--;
                dfs(distance(mp.begin(),it1),1);
                mp[it1->first]++;
            }
            return res;
        }
        bool isSquare(int t)
        {
            int s=sqrt(t);
            return s*s==t;
        }
        void dfs(int a,int il)
        {
            if(il==n)
            {
                res++;
                return;
            }
            map<int,int>::iterator it1,it2;
            for(it1=mp.begin(); it1!=mp.end(); it1++)
            {
                int k=distance(mp.begin(),it1);
                if(dp[a][k]&&mp[it1->first]>0)
                {
                    mp[it1->first]--;
                    dfs(k,il+1);
                    mp[it1->first]++;
                }
            }
        }
};

下面是常规代码,对于具有相同元素,超时了

class Solution {
    public:
        int n=13;
        vector< vector<int> > vv;

        bool  vist[13];

        int dp[13][13];
        int res[13];

        int numSquarefulPerms(vector<int>& A) {

            n=A.size();
            for(int i=0; i<n; i++)
            {
                for(int j=0; j<=i; j++)
                    if(isSquare(A[i]+A[j]))
                    {
                        dp[j][i]=1;
                        dp[i][j]=1;
                    } 
            }
            for(int i=0; i<n; i++)
            {
                memset(vist,0,sizeof(vist));
                vist[i]=true;
                res[0]=A[i];
                dfs(1,A);
                vist[i]=false;
            }
            
            return vv.size();
        }
        
        bool isSquare(int t)
        {
            int s=sqrt(t);
            return s*s==t;
        }
        
        void dfs(int il,vector<int>& A)
        {
            
            if(il==n)
            {
                for(int i=0; i<vv.size(); i++)
                {
                    int j;
                    for(j=0; j<n; j++)
                    {
                        if(vv[i][j]==res[j]) continue;
                        else break    ;
                    }
                    if(j==n) return;
                }
                vector<int> r;
                for(int i=0; i<n; i++) r.push_back(res[i]);
                vv.push_back(r);
                return;
            }
            for(int i=0; i<n; i++)
            {
                if(vist[i]==false&&dp[il][i])
                {
                    vist[i]=true;
                    res[il]=A[i];
                    dfs(il+1,A);
                    vist[i]=false;
                }
            }
        }
};

其实关键是常规算法需要排除重复的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LeetCode-Editor是一种在线编码工具,它提供了一个用户友好的界面编写和运行代码。在使用LeetCode-Editor时,有时候会出现乱码的问题。 乱码的原因可能是由于编码格式不兼容或者编码错误导致的。在这种情况下,我们可以尝试以下几种解决方法: 1. 检查文件编码格式:首先,我们可以检查所编辑的文件的编码格式。通常来说,常用的编码格式有UTF-8和ASCII等。我们可以将编码格式更改为正确的格式。在LeetCode-Editor中,可以通过界面设置或编辑器设置来更改编码格式。 2. 使用正确的字符集:如果乱码是由于使用了不同的字符集导致的,我们可以尝试更改使用正确的字符集。常见的字符集如Unicode或者UTF-8等。在LeetCode-Editor中,可以在编辑器中选择正确的字符集。 3. 使用合适的编辑器:有时候,乱码问题可能与LeetCode-Editor自身相关。我们可以尝试使用其他编码工具,如Text Editor、Sublime Text或者IDE,看是否能够解决乱码问题。 4. 查找特殊字符:如果乱码问题只出现在某些特殊字符上,我们可以尝试找到并替换这些字符。通过仔细检查代码,我们可以找到导致乱码的特定字符,并进行修正或替换。 总之,解决LeetCode-Editor乱码问题的方法有很多。根据具体情况,我们可以尝试更改文件编码格式、使用正确的字符集、更换编辑器或者查找并替换特殊字符等方法来解决这个问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值