【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; 
}

};

posted on 2022-05-23 19:07  damnglamour  阅读(20)  评论(0)    收藏  举报