第 66 场双周赛

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;
    }
上一篇:ABAP-AES加解密


下一篇:Ubuntu18.04 搭建YOLOV4环境