第 302 场周赛
我走得很慢!但我从不后退!
6120. 数组能形成多少数对
思路: 如果元素成对出现,那么一定能被2整除,因此,我们把数组中出现的数字的个数存储下来,然后遍历map,对map中个元素进行除2操作,能被2整除的即是start,不能被2整除的就是剩余的元素个数。
class Solution {
public:
vector<int> numberOfPairs(vector<int>& nums) {
map<int,int> mp;
for(int i=0;i<nums.size();i++){mp[nums[i]]++;}
int start=0,end=0;
for(auto&[x,y]:mp){
start+=y/2;
end += y%2;
}
return vector<int>{start,end};
}
};
6164. 数位和相等数对的最大和
思路: 1.求每个数的数位和 2.map存数位和以及当前数位和下的最大数字(贪心) 3.更新答案。
class Solution {
public:
int maximumSum(vector<int>& nums) {
unordered_map<int,vector<int>>mp;
for (int x : nums) {
int t = 0;
for (int y = x; y; y /= 10) t += y % 10;
mp[t].push_back(x);
}
int ans=-1;
for(auto it=mp.begin();it!=mp.end();it++){
if(it->second.size()>1){
sort(it->second.begin(),it->second.end());
int sz=it->second.size();
ans=max(ans,it->second[sz-1]+it->second[sz-2]);
}
}
return ans;
}
};
6121. 裁剪数字后查询第 K 小的数字
思路: 本题的核心是将裁剪后的字符串以及对应的下标绑定起来,然后进行一个排序,因此可以用pair来存储裁剪后的字符串以及对应的下标信息,再通过vector进行排序。
- 首先,遍历queries,得到k和trim
- 然后再次基础上遍历nums,得到对应截取后的字符串以及下标,存入vector<pair<string,int>>当中
- 对vector<pair<string,int>>进行排序
- 最后,找到 nums 中第 ki 小数字对应的下标
class Solution {
public:
vector<int> smallestTrimmedNumbers(vector<string>& nums, vector<vector<int>>& queries) {
vector<int> ans(queries.size(),0);
int nSize = nums[0].size();
for(int i=0;i<queries.size();i++){
int k = queries[i][0];
int trim=queries[i][1];
vector<pair<string,int>> t(nums.size());
for(int j=0;j<nums.size();j++){
t[j] = make_pair(nums[j].substr(nSize-trim),j);
}
sort(t.begin(),t.end());
ans[i] = t[k-1].second;
}
return ans;
}
};
6122. 使数组可以被整除的最少删除次数
思路: 能被一堆数整除就是能被这堆数的最大公约数整除
- 首先找到numsDivide中的最大公因子
- 在nums(排序好之后)中寻找是否有符合numsDivide中的最大公因子相等的元素(即能够整除的元素),如果有就返回下标。(这就是利用排序之后的好处,这样既可得到最小的删除次数)
class Solution {
public:
int minOperations(vector<int>& nums, vector<int>& numsDivide) {
int g=0;
for(int x:numsDivide){
g=gcd(g,x);
}
sort(nums.begin(),nums.end());
for(int i=0;i<nums.size();i++){
if(g%nums[i]==0)return i;
}
return -1;
}
};
总结
本次周赛难度总体来说其实并不大(相比前几次),但是做的不咋地。 反思总结有以下的问题: 1.对于stl库中map,pair这类并没有很常用,操作起来有点生疏 2.最近一周在外面玩,做题的感觉好像无了(自己菜,还找借口) 3.t1主要是从别的角度考虑(奇偶能否被整除);t2 模拟+贪心,但是是通过 unordered_map<int,vector>mp;来存储数组,之前都是map<int,int>这种;需要学习一下;t3模拟,使用vector<pair<string,int>>来存储剪裁的字符串以及下标,方便排序;t4能被一堆数整除就是能被这堆数的最大公约数整除;使用到gcd的函数
|