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(); } };