LeetCode第 303 场周赛

Posted William_Tao(攻城狮)

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode第 303 场周赛相关的知识,希望对你有一定的参考价值。

LeetCode第 303 场周赛

第 303 场周赛

自己选择的路,就开心的走下去

2351. 第一个出现两次的字母

第一个出现两次的字母

循环扫描字符串s,遇到每一个字符就将对应字符个数加一
如果第一个字符统计个数为2那就说明该元素是最先出现的,直接返回。

复杂度o(n^3)

class Solution 
public:
    char repeatedCharacter(string s)
        char res;
        map<char,int> m;
        for(auto& c:s)
            ++m[c];
            if(m[c]==2)
                return c;
            
        return ' ';
        
    
;

2352. 相等行列对

2352. 相等行列对

思路:

暴力枚举

  1. n行n列的矩阵,循环遍历每一行和每一列的元素,如果行列对应元素不等那么就不可能成为答案。
  2. 如果对应行和列的元素全部相等,则答案加一。
class Solution 
public:
    int equalPairs(vector<vector<int>>& grid) 
        int row = grid[0].size();
        int col = grid.size();
        int cnt=0;
        for(int i=0;i<row;i++)
            for(int j=0;j<col;j++)
                 bool same = true;
                for(int k =0;k<col &&same;k++)
                    if(grid[i][k]!=grid[k][j])
                        same = false;
                    
                 
                if(same)cnt++;
            
        
        return cnt;
    
;

思路二:

将矩阵进行转置。

比较对应元素的值是否相等即可

复杂度o(n^2)

class Solution 
public:
    int equalPairs(vector<vector<int>>& grid) 
        int row = grid[0].size();
        int col = grid.size();
        int cnt=0;
         bool same ;
        vector<vector<int>> Revsgrid(row,vector<int>(col));
       for(int i=0;i<row;i++)
           for(int j=0;j<col;j++)
               Revsgrid[i][j] =grid[j][i];
           
       
       //其实就是比较行时候对应位置知否相等
         for(auto t:grid)
            for(auto p:Revsgrid)
        if(t==p) cnt++;
            
             
        
            return cnt;
       
       
;

方法三:

hashmap

将矩阵的每一行元素存储为字符串(因为行元素可能很多,不方便存储),然后将矩阵的元素按照“,”划分。将每一行字符串存入hashmap作为key,同时value加一

转置按列来存储,如果发现此前按行存储的有对应的值,则将mp中的value取出加到结果到当中(mp中的key可能重复,所以不能仅仅是加一)

class Solution 
public:
    int equalPairs(vector<vector<int>>& grid) 
        int row = grid[0].size();
        int col = grid.size();
        int cnt=0;
         unordered_map<string, int> mp;
         bool same ;
       for(int i=0;i<row;i++)
            string s = "";
           for(int j=0;j<col;j++)
           s+=to_string(grid[i][j]);
           s+=",";
           
           //除去最后一个字符,
           s.pop_back();
           mp[s]++;
       
       //
          for(int i=0;i<row;i++)
            string s = "";
           for(int j=0;j<col;j++)
           s+=to_string(grid[j][i]);
           s+=",";
           
           //除去最后一个字符,
           s.pop_back();
           if(mp.count(s))
               cnt+=mp[s];
           
       
            return cnt;
       
       
;

2353. 设计食物评分系统

2353. 设计食物评分系统

思路:

平衡树(有序集合)

我们可以用一个哈希表 \\textitfsfs 记录每个食物名称对应的食物评分和烹饪方式,另一个哈希表套平衡树 cs 记录每个烹饪方式对应的食物评分和食物名字集合。

对于 changeRating 操作,先从cs[fs[food].cuisine]中删掉旧数据,然后将 newRatingnewRating 和 food 记录到 cs 和fs 中。

这里pair中的评分使用负, 这里放入“负的评分”和字符串,这样“负的评分”小的,也就是评分大的食物会排在前面

作者:endlesscheng
链接:https://leetcode.cn/problems/design-a-food-rating-system/solution/ha-xi-biao-tao-ping-heng-shu-by-endlessc-hzct/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

class FoodRatings 
    //set中pair这样设计是为了使得pair默认先比较食物评分,然后再比较后面的食物名字字典排序
    unordered_map<string,set<pair<int,string>>> cs;;// 烹饪方式----> (食物评分,食物名字)
    unordered_map<string,pair<int,string>> fs;//食物 ---->(食物评分,烹饪方式)

public:
    FoodRatings(vector<string>& foods, vector<string>& cuisines, vector<int>& ratings) 
        for(int i = 0;i<foods.size();i++)
            auto& f = foods[i],&c = cuisines[i];
            //cout<<f<<":"<<c<<endl;
            int r = ratings[i];
            fs[f] = r,c;
            //在迭代器指向的元素之前创建一个元素,并返回新添加元素的迭代器;
            cs[c].emplace(-r,f);//确保最小的对应的是最高的评分
         
        
    
    
    void changeRating(string food, int newRating) 
        auto &[r,c] = fs[food];
        auto &s = cs[c];
        //把旧的元素删除
        s.erase(-r,food);
        //把新的添加进来
        s.emplace(-newRating,food);
        //修改评分(下一次再调用changeRatig能够保证值是变化之后的值)
        r = newRating;
    
    
    string highestRated(string cuisine) 
        return cs[cuisine].begin()->second;
    
;

2354. 优质数对的数目

2354. 优质数对的数目

思路:等价转换+脑筋急转弯

https://leetcode.cn/problems/number-of-excellent-pairs/solution/deng-jie-zhuan-huan-pythonjavacgo-by-end-2qzs/

class Solution 
public:
    long long countExcellentPairs(vector<int>& nums, int k) 
        long  res= 0L;
        unordered_map<int,int> mp;
        for(int x:unordered_set<int>(nums.begin(),nums.end()))
            mp[__builtin_popcount(x)]++;//将统计二进制数为多少的进行一个统计
        
        for(auto&[cx,ccx]:mp)
            for(auto&[cy,ccy]:mp)
                if(cx+cy>=k)
                    res+=(long)ccx*ccy;
                
            
        
        return res;
    
;

总结:
本次周赛是通过练习的方式去完成的,并没有参加。
T1:属于一个hashmap存储,优先存储到2的即为首个出现的字母(不算难)
T2:主要的潜在核心就是能够将题目中的行列的信息,进行矩阵的转置然后再比较对应位置上的元素,主要有直接暴力枚举,矩阵转置,hashmap。但我感觉矩阵转置好一点,hashmap的思想和矩阵转置差不大多,而且还不好想,还有点麻烦。(个人感觉)
T3:主要就是设置好一点的数据结构,能够满足最终结果所需要的。难点在于数据结构的设计这一块。
T4:属于脑筋急转弯和集合相关的内容了,有点吃力。(好像还是不太懂!)同时再看解析的时候,学到了__builtin_popcount(x)这一个函数。用于计算一个 32 位无符号整数有多少个位为1
后面的过程将持续总结前面做过周赛的题目,进行一个巩固。同时持续学习C++中stl中常用的一些知识点。

以上是关于LeetCode第 303 场周赛的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode第 303 场周赛

leetcode 第 277 场周赛

解题报告力扣 第 272 场周赛

解题报告力扣 第 263 场周赛

Leetcode第240场周赛总结+题解

Leetcode 第56场双周赛 / 第249场周赛 / 1411. 给 N x 3 网格图涂色的方案数(这次主要还是学动规思想和迪杰斯克拉)