【2022/05/15-第293场单周赛】复盘

总结
第四题算了一下复杂度就放弃了简单的区间合并,其实是能过的。
Q1.移除字母异位词后的结果数组
计算每个词字母出现频数,然后一路对比即可。
class Solution {
public:
vector<string> removeAnagrams(vector<string>& words) {
int n = words.size();
vector<vector<int>> h(n, vector<int>(26,0));
vector<int> f(n, 0);
f[0] = 1;
for(auto i : words[0]) h[0][i - 'a']++;
for(int index = 1; index < n; ++index){
for(auto i : words[index]) h[index][i - 'a']++;
if(h[index] == h[index - 1]) f[index] = 0;
else f[index] = 1;
}
vector<string> ret;
for(int i = 0; i < n; ++i){
if(f[i] == 1) ret.push_back(words[i]);
}
return ret;
}
};
Q2.不含特殊楼层的最大连续楼层数
排序,然后逐个处理即可,要注意边界情况。
class Solution {
public:
int maxConsecutive(int bottom, int top, vector<int>& s) {
int pre = bottom, ret = 0, n = s.size();
sort(s.begin(), s.end());
ret = max(ret, s[0] - pre);
pre = s[0];
for(int i = 1; i < n; ++i){
ret = max(ret, s[i] - pre - 1);
pre = s[i];
}
ret = max(ret, top - pre);
return ret;
}
};
Q3.按位与结果大于零的最长组合
对于二进制下每一位,求数组中该位为1的数的数目,最大的数就是结果。
class Solution {
public:
int largestCombination(vector<int>& c) {
int n = c.size();
int h[32];
memset(h, 0, sizeof(h));
for(int i = 0; i < n; ++i){
for(int j = 0; j < 32; ++j){
if(c[i]){
h[j] += c[i] & 1;
c[i] >>= 1;
}
else break;
}
}
int ret = 1;
for(int i = 0; i < 32; ++i){
ret = max(h[i], ret);
}
return ret;
}
};
Q4.统计区间中的整数数目
class CountIntervals {
public:
map<int, int> mp;
int cnt = 0;
CountIntervals() {
}
void add(int left, int right) {
for (auto it = mp.lower_bound(left); it != mp.end() && it->second <= right; mp.erase(it++)) {
int l = it->second, r = it->first;
left = min(left, l);
right = max(right, r);
cnt -= r - l + 1;
}
cnt += right - left + 1;
mp[right] = left;
}
int count() {
return cnt;
}
};
浙公网安备 33010602011771号