LeetCode第 303 场周赛

LeetCode第 303 场周赛

  • 第 303 场周赛
    • 2351. 第一个出现两次的字母
    • 2352. 相等行列对
    • 2353. 设计食物评分系统
    • 2354. 优质数对的数目

第 303 场周赛

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

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

第一个出现两次的字母
LeetCode第 303 场周赛_第1张图片

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

复杂度o(n^3)

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

2352. 相等行列对

2352. 相等行列对
LeetCode第 303 场周赛_第2张图片

思路:

暴力枚举

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

思路二:

将矩阵进行转置。

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

复杂度o(n^2)

class Solution {
public:
    int equalPairs(vector>& grid) {
        int row = grid[0].size();
        int col = grid.size();
        int cnt=0;
         bool same ;
        vector> Revsgrid(row,vector(col));
       for(int i=0;i

方法三:

hashmap

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

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

class Solution {
public:
    int equalPairs(vector>& grid) {
        int row = grid[0].size();
        int col = grid.size();
        int cnt=0;
         unordered_map mp;
         bool same ;
       for(int i=0;i

2353. 设计食物评分系统

2353. 设计食物评分系统

LeetCode第 303 场周赛_第3张图片

思路:

平衡树(有序集合)

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

对于 changeRating 操作,先从cs[fs[food].cuisine]中删掉旧数据,然后将 newRating}newRating 和 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>> cs;;// 烹饪方式----> (食物评分,食物名字)
    unordered_map> fs;//食物 ---->(食物评分,烹饪方式)

public:
    FoodRatings(vector& foods, vector& cuisines, vector& ratings) {
        for(int i = 0;isecond;
    }
};

2354. 优质数对的数目

2354. 优质数对的数目
LeetCode第 303 场周赛_第4张图片

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

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

class Solution {
public:
    long long countExcellentPairs(vector& nums, int k) {
        long  res= 0L;
        unordered_map mp;
        for(int x:unordered_set(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,算法,职场和发展)