LeeCode第291场单周赛回顾总结
一、6047.移除指定数字得到最大结果
1、原题链接:
2、解题思路:
(第一题纯属搞心态,乱我道心)
第一题其实只要想明白,思路还是比较简单的,具体看代码体现。
3、参考代码:
class Solution {
public:
string removeDigit(string number, char digit) {
string res, tmp;
int n = number.size();
for(int i = 0; i < n; i ++)
if(digit == number[i]){
tmp = number;
//删除第i个元素
tmp.erase(tmp.begin()+i);
//如果res为空或者tmp大于res则res = tmp
if(res.empty() || tmp > res) res = tmp;
}
return res;
}
};
二、2260.必须拿起的最小连续卡牌数
1、原题链接:
2、解题思路:
这一题说来有点波折,受第一题没做出的影响这题有点开摆,直接一通暴力加疯狂提交,然后WA了五次。。。
但是经过代码的优化后,得到了如下代码还是成功拿下了这一题。
具体思路:
用map来边存边比较,先存储不存在的元素,然后若出现与之前相同的元素,就做一个比较,较小的用res来保存,这样我们就只需要遍历一遍即可,不会出现两层for循环然后报TIME LIMITED。
3、参考代码:
class Solution {
public:
int minimumCardPickup(vector<int>& cards) {
int n = cards.size();
int res = INT_MAX;
unordered_map<int,int> mp;
for(int i = 0; i < n; i ++){
if(mp[cards[i]]){
int tmp = i - mp[cards[i]] + 1 + 1;
res = min(res,tmp);
}
mp[cards[i]] = i+1;
}
if(res > 100000) return -1;
return res;
}
};
三、2261.含最大K个可整除元素的子数组
1、原题链接:
2、解题思路:
我们可以枚举所有的子数组,从前往后遍历时用2个指针记录当前满足能被p整除的个数,当个数超过k时将左边的指针往前走一步,右边的指针重新初始化**。
这里为了去重方便,用一个string的set来保存,拼接时候用一个字符分割就行了。
3、参考代码:
class Solution {
public:
int countDistinct(vector<int>& nums, int k, int p) {
int n = nums.size();
set<string> s;
for (int i = 0; i < n; ++i) {
int cnt = 0;
string str = "";
for (int j = i; j < n; ++j) {
if (nums[j] % p == 0) {
++cnt;
}
if (cnt <= k) {
//分隔符
str += ",";
str += to_string(nums[j]);
s.insert(str);
} else {
break;
}
}
}
return s.size();
}
};
