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. 相等行列对
思路:
暴力枚举
- n行n列的矩阵,循环遍历每一行和每一列的元素,如果行列对应元素不等那么就不可能成为答案。
- 如果对应行和列的元素全部相等,则答案加一。
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. 设计食物评分系统
思路:
平衡树(有序集合)
我们可以用一个哈希表 \\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. 优质数对的数目
思路:等价转换+脑筋急转弯
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 第56场双周赛 / 第249场周赛 / 1411. 给 N x 3 网格图涂色的方案数(这次主要还是学动规思想和迪杰斯克拉)