LeetCode第 319 场周赛题解

35 篇文章 3 订阅

2469. 温度转换

在这里插入图片描述
模拟

class Solution {
public:
    vector<double> convertTemperature(double celsius) {
        return {celsius+273.15,celsius*1.8+32};
    }
};

2470. 最小公倍数为 K 的子数组数目

在这里插入图片描述
时间复杂度 n 2 n^2 n2完全足够。
公式:x=x*nums[j]/gcd(x,nums[j]);

class Solution {
public:
    int subarrayLCM(vector<int>& nums, int k) {
        int n=nums.size();
        int res=0;
        for(int i=0;i<n;i++)
        {
            int x=nums[i];
            for(int j=i;j<n;j++)
            {
                x=x*nums[j]/gcd(x,nums[j]);
                if(x==k)res++;
                else if(x>k)break;
            }
        }
        return res;
    }
};

2471. 逐层排序二叉树所需的最少操作数目

在这里插入图片描述
在这里插入图片描述
本题考查置换环
如何构建环?
比如该数组为
[7,6,8,5]
[5,6,7,8]<—排好序
将上下两个点相连,每一个环内是需要交换的,交换次数为环的大小减1
个人感觉并查集比较方便:前置知识:并查集求集合中点的个数

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
#define x first
#define y second
typedef pair<int,int>PII; 
class Solution {
public:
    static const int N=1e5+10;
    int f[N],cnt[N];
    int find(int x)
    {
        if(x!=f[x])f[x]=find(f[x]);
        return f[x];
    }
    void unite(int x,int y)
    {
        int a=find(x),b=find(y);
        if(a!=b)
        {
            cnt[a]+=cnt[b];
            f[b]=a;
        }
    }
    int bfs(TreeNode *root)
    {
        queue<TreeNode*>q;
        q.push(root);
        int res=0;
        while(q.size())
        {
            int sz=q.size();
            vector<int>v;
            for(int i=0;i<sz;i++)
            {
                auto t=q.front();
                q.pop();
                v.push_back(t->val);
                if(t->left)q.push(t->left);
                if(t->right)q.push(t->right);
            }
            vector<PII>p;
            for(auto x:v)p.push_back({0,x});
            sort(v.begin(),v.end());
            for(int i=0;i<v.size();i++)p[i].x=v[i];
            for(auto x:p)unite(x.x,x.y);
            for(auto x:p)
                if(f[x.x]==x.x)
                    res+=cnt[x.x]-1;
        }
        return res;
    }
    int minimumOperations(TreeNode* root) {
        for(int i=0;i<N;i++)f[i]=i,cnt[i]=1;
        return bfs(root);
    }
};

2472. 不重叠回文子字符串的最大数目

在这里插入图片描述
字符串哈希便与o(1)查看该子串是否为回文串,贪心枚举一下最多有多少个区间即可。

const int N=2010,base=131;
typedef unsigned long long ull;
typedef pair<int,int>PII;
#define x first
#define y second
class Solution {
public:
    ull p[N],h1[N],h2[N];
    ull get1(int l,int r)
    {
        return h1[r]-h1[l-1]*p[r-l+1];
    }
    ull get2(int l,int r)
    {
        return h2[r]-h2[l-1]*p[r-l+1];
    }
    int maxPalindromes(string s, int k) {
        int n=s.size();
        vector<PII>v;
        string s1=s;
        reverse(s.begin(),s.end());
        string s2=s;
        s1=" "+s1,s2=" "+s2;
        p[0]=1;
        for(int i=1;i<=n;i++)
        {
            p[i]=p[i-1]*base;
            h1[i]=h1[i-1]*base+s1[i];
        }
        for(int i=1;i<=n;i++)
            h2[i]=h2[i-1]*base+s2[i];
        for(int len=k;len<=n;len++)
        {
            for(int l=1;l+len-1<=n;l++)
            {
                int r=l+len-1;
                if(get1(l,r)==get2(n-r+1,n-l+1))v.push_back({l,r});
            }
        }
        sort(v.begin(),v.end(),[&](PII a,PII b){
            return a.y<b.y;
        });
        int res=0;
        int ed=-2e9;
        for(int i=0;i<v.size();i++)
        {
            if(ed<v[i].x)
            {
                res++;
                ed=v[i].y;
            }
        }
        return res;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

leimingzeOuO

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值