力扣——第 319 场周赛

124 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第10天,点击查看活动详情

力扣——第 319 场周赛

2469. 温度转换 - 力扣(LeetCode)

问题解析

  • 开氏度 = 摄氏度 + 273.15
  • 华氏度 = 摄氏度 * 1.80 + 32.00

计算完后存入vector返回即可。

AC代码

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

2470. 最小公倍数为 K 的子数组数目 - 力扣(LeetCode)

问题解析

第一层for循环枚举子数组的左端点,第二层for循环枚举子数组的右端点。

计算数组的最小公倍数num,当num==k时,答案++;当num>k时,最小公倍数没有变回k的可能性了,不用再枚举之后的右端点。

AC代码

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

2471. 逐层排序二叉树所需的最少操作数目 - 力扣(LeetCode)

最暴力的做法。

  1. 用队列对树进行层序遍历,把每一层的节点从左到右记录下来。
  2. 对每一层的节点进行排序。
  3. 遍历未排序前的每一层的节点,根据排序后的结果将他们安排在合适的位置,每安排一次操作数++。
  4. 返回操作数。

AC代码

/**
 * 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) {}
 * };
 */
class Solution {
public:
    int minimumOperations(TreeNode* root) {
        queue<TreeNode*>que;
        que.push(root);
        int cnt = 0;
        while (!que.empty())
        {
            int len = que.size();
            vector<int>ans(len);
            for (int i = 0; i < len; i++)
            {
                auto t = que.front();
                que.pop();
                ans[i] = t->val;
                if (t->left)que.push(t->left);
                if (t->right)que.push(t->right);
            }
            vector<int>a = ans;
            unordered_map<int, int>mymap;
            sort(a.begin(), a.end());
            for (int i = 0; i < len; i++)
            {
                mymap[a[i]] = i;
            }
            int idx = 0;
            while (idx < len)
            {
                if (idx == mymap[ans[idx]])idx++;
                else
                {
                    swap(ans[idx], ans[mymap[ans[idx]]]);
                    cnt++;
                }
            }
        }
        return cnt;
    }
};

2472. 不重叠回文子字符串的最大数目 - 力扣(LeetCode)

问题解析

设立二维状态转移数组f,f[i] [j]表示以i位置为开头,j位置为结尾,可以分割出f[i] [j]个长度为k的回文子串。答案为:f[0] [n-1]。

先用二维bool数组dp预处理字符串,dp[i] [j]表示字符串s的第i个位置到第j个位置是否是回文串:

  1. dp[i] [i]和dp[j] [i](ps:j>i)初始都为true;
  2. 如果s[i-1]==s[j+1],且dp[i] [j]为true,则dp[i-1] [j+1]也为true;

根据预处理的结果,开始分割字符串s,有状态转移方程:

f[i] [j]=max(f[i] [j],f[i+1] [j]);

若dp[j+1] [n]为true,有:f[i] [n-1] = max(f[i] [n-1],f[i] [j] + num);

AC代码

class Solution {
public:
    int f[2050][2050];
    int maxPalindromes(string s, int k) {
        int n=s.size(),mx=0;
        if(k==1)return n;
        vector<vector<bool>>dp(n,vector<bool>(n,false));
        for(int i=0;i<n;i++)dp[i][i]=true;
        int len=1,l=0;
        for(int j=1;j<n;j++)
            for(int i=0;i<n;i++)
            {
                if(s[i]!=s[j])dp[i][j]=false;
                else 
                {
                    if(j-i<3)dp[i][j]=true;
                    else
                    {
                        dp[i][j]=dp[i+1][j-1];
                    }
                }
            }
        for(int i=n-1;i>=0;i--)
            for(int j=i+k-1;j<n;j++)
            {
                if(dp[i][j])f[i][j]=1;
                f[i][j]=max(f[i][j-1],f[i][j]);
            }
        
        for(int i=n-1;i>=0;i--)
            for(int j=i+k-1;j<n;j++)
            {
                int num = 0;
                if (n - j - 1 >= k)num = f[j + 1][n-1];
                f[i][j] = max(f[i][j], f[i + 1][j]);
                f[i][n-1] = max(f[i][n-1],f[i][j] + num);
            }
        return f[0][n-1];
    }
};