class Solution {
public:
string modifyString(string s) {
int N = s.length();
if(s[0]=='?')
{
for(int p = 'a'; p<='z'; p++)
{
if(s[1]!=p)
{
s[0] = p;
}
}
}
if(s[N-1]=='?')
{
for(int p = 'a'; p<='z';p++)
{
if(s[N-2]!=p)
{
s[N-1] = p;
}
}
}
for(int i=1;i<N-1;i++)
{
if(s[i]=='?')
{
for(int p = 'a'; p<='z'; p++)
{
if(s[i-1]!=p&&s[i+1]!=p)
s[i] = p;
}
}
}
return s;
}
};
class Solution {
public:
string modifyString(string s) {
int N = s.length();
for(int i=0;i<N;i++)
{
if(s[i] != '?')
continue;
char c = 'a';
while(i&&s[i-1]==c||i<N-1&&s[i+1]==c) ++c;
s[i] = c;
}
return s;
}
};
哈希表,但是自己的思路不够简洁啊,
typedef long long LL;
class Solution {
public:
int numTriplets(vector<int>& nums1, vector<int>& nums2) {
map<LL,vector<int>> m1, m2;
for(int i=0; i<nums1.size(); i++)
{
m1[(LL)nums1[i]].push_back(i);
}
for(int j=0; j<nums2.size(); j++)
{
m2[(LL)nums2[j]].push_back(j);
}
int ans = 0;
int add1 = 0;
int add2 = 0;
for(int i=0;i<nums1.size();i++)
{
LL mul = (LL)nums1[i]*(LL)nums1[i];
for(int j=0;j<nums2.size();j++)
{
if(mul%(long long)nums2[j]!=0)
continue;
LL num = mul / (LL)nums2[j];
if(m2.find(num)!=m2.end())
{
if(num!=nums2[j])
add1+=m2[num].size();
else add1+=m2[num].size()-1;
}
}
}
add1/=2;
for(int i=0;i<nums2.size();i++)
{
LL mul = (LL)nums2[i]*(LL)nums2[i];
for(int j=0;j<nums1.size();j++)
{
if(mul%(long long)nums1[j]!=0)
continue;
LL num = mul / (LL)nums1[j];
if(m1.find(num)!=m2.end())
{
if(num!=nums1[j])
add2+=m1[num].size();
else add2+=m1[num].size()-1;
}
}
}
add2/=2;
return add1+add2;
}
};
typedef long long LL;
class Solution {
public:
int work(vector<int>& v1, vector<int>& v2)
{
int res = 0;
unordered_map<LL, int> hash;
for(int x : v1)
hash[(LL)x*x]++;
for(int j=0;j<v2.size();j++)
{
for(int k=j+1;k<v2.size();k++)
{
res += hash[(LL)v2[j]*v2[k]];
}
}
return res;
}
int numTriplets(vector<int>& nums1, vector<int>& nums2) {
int ans = work(nums1,nums2) + work(nums2,nums1);
return ans;
}
};
class Solution {
public:
vector<int> costs;
vector<int> costsum;
int getminsum(int i, int j)
{
int maxi = -1;
for(int start=i;start<=j;start++)
{
if(costs[start]>maxi)
maxi = costs[start];
}
return costsum[j+1]-costsum[i]-maxi;
}
int minCost(string s, vector<int>& cost) {
costs = cost;
costsum.resize(cost.size()+1);
for(int i=0;i<cost.size();i++)
{
costsum[i+1] = costsum[i]+cost[i];
}
int ans = 0;
int N = s.length();
char prev = s[0];
int prevind = 0;
for(int i=1;i<N;i++)
{
if(s[i]!=prev)
{
if(i>prevind+1)
{
//求prevind~i的最小和
ans += getminsum(prevind, i-1);
}
prev = s[i];
prevind = i;
}
}
ans+=getminsum(prevind,N-1);
return ans;
}
};
双指针
class Solution {
public:
int minCost(string s, vector<int> cost) {
int n = cost.size();
if (n == 1){
return 0;
}
int i = 0;
int j = 1;
int res = 0;
while(j<n)
{
if(s[i]==s[j])
{
if(cost[i]<=cost[j])
{
//删除i
res += cost[i];
i = j;
j++;
}
else{
//删除j
res += cost[j];
j++;
}
}
else{
i = j;
j++;
}
}
return res;
}
};
最小生成树,利用kruskal算法先选取
class Solution {
public:
vector<int> pa, pb;
int find(vector<int>&p, int x)
{
return p[x] == x ? x : p[x] = find(p, p[x]);
}
int maxNumEdgesToRemove(int n, vector<vector<int>>& edges) {
pa.resize(n+1);
pb.resize(n+1);
for(int i=1;i<=n;i++)
pa[i] = pb[i] = i;
int res = 0;
int ca = n;
int cb = n;
for(auto edge:edges)
{
if(edge[0]==3)
{
int x = edge[1];
int y = edge[2];
int fax = find(pa,x), fay = find(pa, y);
int fbx = find(pb,x), fby = find(pb, y);
if(fax!=fay)
{
pa[fax] = fay;
ca--;
pb[fbx] = fby;
cb--;
}else{
res++;
}
}
}
for(auto edge:edges)
{
if(edge[0]==3)
continue;
int x = edge[1];
int y = edge[2];
if(edge[0]==1)
{
int fax = find(pa, x), fay = find(pa, y);
if(fax != fay)
{
pa[fax] = fay;
ca--;
}
else res++;
}
else{
int fbx = find(pb, x), fby = find(pb, y);
if(fbx != fby)
{
pb[fbx] = fby;
cb--;
}
else res++;
}
}
if(ca>1||cb>1)
return -1;
return res;
}
};