5922. 统计出现过一次的公共字符串
哈希
unordered_map<string,int>m1,m2;
int countWords(vector<string>& words1, vector<string>& words2) {
for(int i=0;i<words1.size();i++)m1[words1[i]]++;
for(int i=0;i<words2.size();i++)m2[words2[i]]++;
int sum=0;
for(int i=0;i<words1.size();i++)
{
if(m1[words1[i]]==1)
{
if(m2.find(words1[i])!=m2.end()&&m2[words1[i]]==1)sum++;
}
}
return sum;
}
5923. 从房屋收集雨水需要的最少水桶数
先放两边有屋子的,再放只有一边有屋子的,判断还有没有无法接到雨水的房子。
int minimumBuckets(string s) {
int n=s.size();
int res=0;
for(int i=1;i<n-1;i++)
{
if(s[i]=='.'&&s[i-1]=='H'&&s[i+1]=='H')
{
res++;
s[i]='X';
s[i+1]=s[i-1]='X';
}
}
for(int i=0;i<n;i++)
{
if(s[i]=='H')
{
if(i+1<n&&s[i+1]=='.')
{
res++;
s[i]=s[i+1]='X';
continue;
}
if(i-1>=0&&s[i-1]=='.')
{
res++;
s[i]=s[i-1]='X';
}
}
}
for(int i=0;i<n;i++)
if(s[i]=='H')return -1;
return res;
}
网格图中机器人回家的最小代价
从起点到终点的代价按哈密顿距离走是固定的
int minCost(vector<int>& startPos, vector<int>& homePos, vector<int>& rowCosts, vector<int>& colCosts) {
int res=0;
if(startPos[0]<homePos[0])
{
for(int i=startPos[0]+1;i<=homePos[0];i++)res+=rowCosts[i];
}
else if(startPos[0]>homePos[0])
{
for(int i=startPos[0]-1;i>=homePos[0];i--)res+=rowCosts[i];
}
if(startPos[1]<homePos[1])for(int i=startPos[1]+1;i<=homePos[1];i++)res+=colCosts[i];
else if(startPos[1]>homePos[1]) for(int i=startPos[1]-1;i>=homePos[1];i--)res+=colCosts[i];
return res;
}
5925. 统计农场中肥沃金字塔的数目
前缀和
int work(int x,int y,vector<vector<int>>& c)
{
int n=c.size()-1,m=c[0].size()-1;
int sum=0,d=1;
for(int i=x;i<n;i++)
{
if(y-d<1||y+d>m)break;
if(c[i][y+d]-c[i][y-d-1]==2*d+1)
{
sum++;
d++;
}
else break;
}
return sum;
}
int countPyramids(vector<vector<int>>& g) {
int n=g.size(),m=g[0].size();
vector<int>w(m+1,0);
vector<vector<int>>s(n+1,w);
vector<vector<int>>G(n,w);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
s[i][j+1]=s[i][j]+g[i][j];
int res=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(g[i-1][j-1])res+=work(i,j,s);
int x=0,y=0;
for(int i=n-1;i>=0;i--)
{
for(int j=m-1;j>=0;j--)
{
G[x][y++]=g[i][j];
if(y==m)
{
x++,y=0;
}
}
}
for(int i=0;i<n;i++)
for(int j=1;j<=m;j++)
s[i][j]=0;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
s[i][j+1]=s[i][j]+G[i][j];
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(G[i-1][j-1])res+=work(i,j,s);
return res;
}