讨论/题目交流/🏆 第 168 场力扣周赛/
🏆 第 168 场力扣周赛

欢迎小伙伴们在这里交流分享你的参赛心得以及体验。【前往竞赛

image.png

3 分 - 统计位数为偶数的数字
4 分 - 划分数组为连续数字的集合
6 分 - 子串的最大出现次数
7 分 - 你能从盒子里获得的最大糖果数

第一题

直接依次统计位数就行了,没有边界条件处理

class Solution {
public:
    int findNumbers(vector<int>& nums) {
        int ans = 0;
        
        for(auto x:nums) {
            int cnt = 0;
            while(x) {
                cnt ++;
                x/=10;
            }
            if(cnt%2==0) ans++;
        }
        return ans;
    }
};

第二题

贪心,首先用hashhash表统计数字出现的次数,可以理解为一一段段的线段:
对于线段的两个端点,在删除的时候也一定是长度为k的线段的头尾的形式进行删除的。否则将不可能成功删除。
代码:

class Solution {
public:
    bool isPossibleDivide(vector<int>& nums, int _k) {
        map<int,int> h;
        for(auto x:nums) h[x]++;
        
        for(auto it = h.begin() ; it != h.end() ; ++it) {
            auto [k,v] = *it;
            if(v == 0) continue;
            if(v < 0) return false;
            for(int i = 0 ; i < _k ; i++) {
                h[k+i]-=v;
            }
        }
        return true;
    }
};

第三题

贪心+滑窗,在大于minlen的情况下,长度越小越好。
采用滑动窗口判断长度为minlen的子串中的字母出现个数。然后选取最大的一个。

class Solution {
public:
    int maxFreq(string s, int maxLetters, int minSize, int maxSize) {
        unordered_map<string,int> h;
        unordered_map<char,int> h2;
        int j = 0;
        int ans = 0;
        for(int i = 0 ; i < s.size() ; i++) {
            h2[s[i]]++;
            if(i-minSize+1>0) {
                if(--h2[s[j]] == 0) h2.erase(s[j]);
                j++;
            }

            if(i>=minSize-1 && h2.size() <= maxLetters)
                ans = max(ans,++h[s.substr(i-minSize+1,minSize)]);
        }
        return ans;
    }
};

第四题

不断地重复:开箱子->拿钥匙/糖果,这个循环就可以了,箱子肯定是越开越少的。O(n2)O(n^2)不超时。

class Solution {
public:
    int maxCandies(vector<int>& status, vector<int>& candies, vector<vector<int>>& keys, vector<vector<int>>& containedBoxes, vector<int>& initialBoxes) {
        int n = status.size();
        vector<bool> ks(n,false), bx(n,false), st(n,false);
        for(auto x:initialBoxes) {
            bx[x] = true;
            for(auto y:keys[x])
                ks[y] = true;
        }
        for(int i = 0 ; i < n ; i ++)
            if(status[i]) ks[i] = true;
        
        int ans = 0;
        bool flag = true;
        
        while(flag) {
            flag = false;
            
            for(int i = 0 ; i < n ; i++) {
                if(st[i]) continue;
                if(ks[i] && bx[i]) {
                    ans += candies[i];
                    for(auto x:keys[i]) ks[x] = true;
                    for(auto x:containedBoxes[i]) bx[x] = true;
                    flag = true;
                    st[i] = true;

                }
            }
        }
        return ans;
    }
};
2
展开全部 16 讨论