开启掘金成长之旅!这是我参与「掘金日新计划 · 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)
最暴力的做法。
- 用队列对树进行层序遍历,把每一层的节点从左到右记录下来。
- 对每一层的节点进行排序。
- 遍历未排序前的每一层的节点,根据排序后的结果将他们安排在合适的位置,每安排一次操作数++。
- 返回操作数。
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个位置是否是回文串:
- dp[i] [i]和dp[j] [i](ps:j>i)初始都为true;
- 如果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];
}
};