class Solution {
public:
vector<double> convertTemperature(double celsius) {
return {celsius+273.15,celsius*1.8+32};
}
};
时间复杂度 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;
}
};
本题考查置换环
如何构建环?
比如该数组为
[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);
}
};
字符串哈希便与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;
}
};