自己选择的路,就开心的走下去
第一个出现两次的字母
循环扫描字符串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. 相等行列对
思路:
暴力枚举
- n行n列的矩阵,循环遍历每一行和每一列的元素,如果行列对应元素不等那么就不可能成为答案。
- 如果对应行和列的元素全部相等,则答案加一。
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|
思路:
平衡树(有序集合)
我们可以用一个哈希表 \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;
}
};
思路:等价转换+脑筋急转弯
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中常用的一些知识点。