Leetcode---2021.7.11周赛

第一题

在这里插入图片描述

思路

很基础的一道题,直接笨方法复制就行!

代码

class Solution {
    public int[] getConcatenation(int[] nums) {
        int len = nums.length;
        int[] ans = new int[len*2];
        for (int i = 0;i<len*2;i++)
            ans[i] = nums[i%len];
        
        return ans;
    }
}

第二题

在这里插入图片描述
在这里插入图片描述

思路

也是很简单的一道题,看起来花里胡哨,但是只需要找到每个字母的第一个和最后一个的位置,然后记录这两个位置之间出现的字母类别数,累加26ge字母的结果即可。
算法步骤:

  1. 字母a开始对整个字符串进行遍历;
  2. 对于每个字符i,找到第一个出现位置,标志位开始变化并使用字符集cur记录后续出现的字母类别;
  3. 如果再次出现当前遍历的字符,则记录的字符集cur存储到该字符对应的总字符集set中;
  4. 遍历整个字符串后,使用ans累加set的元素数量即可;
  5. 检查sign的值,若sign>1证明除了第一个和最后一个字符外还存在其他的字符i,也就是aaa这种情况,因此ans还需要再加1
  6. 重复执行步骤2-5,直至对26个字母完成遍历

时间复杂度O(cn),其中c=26,n为字符串长度

代码

class Solution {
    public int countPalindromicSubsequence(String s) {

        int len = s.length();
        int ans = 0;
        int sign;
        Set<Character> set;
        Set<Character> cur;
        for (int i = 0;i<26;i++)
        {
            sign = 0;
            set = new HashSet<>();
            cur = new HashSet<>();
            for (int j=0;j<len;j++)
            {
                if (s.charAt(j)-'a'==i)
                {
                    sign++;
                    for (char ch : cur)
                        set.add(ch);
                    cur = new HashSet<>();
                }
                else {
                    if (sign!=0)
                        cur.add(s.charAt(j));
                }
            }
            if (sign>1)
            {
                char c = (char) ('a' + i);
//                System.out.println(c+"---"+set);
//                System.out.println(c+"---"+set.size());
                ans += set.size();
            }

            if (sign>2)
                ans+=1;
//            System.out.println(i+" "+ans);

        }

        return ans;
    }
}

第三题在这里插入图片描述

思路

emmm,这个题存在一定的规律,可以根据规律来做,但是在打比赛的时候真的静不下心来完全推完,又因为5×5的网格就有50多万种可能了,所以推到3我就推不下去了。。。

代码–leetcode 小帅啊的代码源地址

public int colorTheGrid(int m, int n) {
        int mod=1000000007;
        int len=(int)Math.pow(3,m);
        long[][]dp=new long[n][len];
        boolean[]isok=new boolean[len];
        int[][]arr=new int[len][];
        for(int i=0;i<len;i++)
        {
            int num=i;
            int[]temarr=new int[m];
            int sta=0;
            while(num!=0){
                temarr[sta++]=num%3;
                num/=3;
            }
            arr[i]=temarr;
            for(int j=1;j<m;j++)
                if(temarr[j]==temarr[j-1])
                {
                    dp[0][i]--;
                    isok[i]=true;
                    break;
                }
            dp[0][i]++;
        }
        for(int i=1;i<n;i++)
        {
            for(int j=0;j<len;j++)
            {
                if(isok[j])continue;
                long jia=dp[i-1][j];
                int[]temarr=arr[j];
                for(int k=0;k<len;k++)
                {
                    if(isok[k])continue;
                    int[]temtemarr=arr[k];
                    for(int a=0;a<m;a++)
                    {
                        if(temtemarr[a]==temarr[a]){
                            dp[i][k]-=jia%mod;
                            break;
                        }
                    }
                    dp[i][k]+=jia%mod;
                }
            }
        }
        long sum=0;
        for(int i=0;i<len;i++)
            sum=(sum+dp[n-1][i])%mod;
        return (int)sum;
    }

第四题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

思路

代码

在这里插入代码片
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值