力扣第356场周赛补题

6917. 满足目标工作时长的员工数目 - 力扣(LeetCode)

思路:暴力

class Solution {
public:
    int numberOfEmployeesWhoMetTarget(vector& hours, int target) {
        int res = 0;
        for(int k : hours) if(k >= target) res ++ ;
        return res;
    }
};

6900. 统计完全子数组的数目 - 力扣(LeetCode)

思路:哈希

class Solution {
public:
    int countCompleteSubarrays(vector& nums) {
        int s = 0;
        map mp;
        for(int k : nums) mp[k] ++ ;
        s = mp.size();
        int n = nums.size();
        int res = 0;
        for(int l = 0; l < n - s + 1; l ++ )
        {
            map tmp;
            for(int r = l; r < n; r ++ )
            {
                tmp[nums[r]] ++ ;
                if(tmp.size() == s)
                {
                    res += n - r;
                    break;
                }
            }
        }
        return res;
    }
};

6918. 包含三个字符串的最短字符串 - 力扣(LeetCode)

思路:3个字符串也就6种情况,枚举即可,比赛时想复杂了

class Solution {
public:
    string minimumString(string a, string b, string c) {
        string res;
        vector str = {a, b, c};

        auto check = [&](){
            string s = str[0];

            for(int i = 1; i < 3; i ++ )
            {
                for(int l = 0; l <= s.size(); l ++ )
                {
                    int sz = min(s.size() - l, str[i].size());
                    if(s.substr(l, sz) == str[i].substr(0, sz))
                    {
                        s += str[i].substr(sz, str[i].size() - sz);
                        break;
                    }
                }
            }

            if(res.empty()) res = s;
            else if(res.size() > s.size()) res = s;
            else if(res.size() == s.size() && res > s) res = s;
        };

        for(int i = 0; i < 6; i ++ )
        {
            check();
            next_permutation(str.begin(), str.end());
            //计算排列组合的函数,“下一个”排列组合
        }

        return res;
    }
};

6957. 统计范围内的步进数字数目 - 力扣(LeetCode)

思路:数位dp

class Solution {
    const int mod = 1e9 + 7;
    bool valid(string &s)
    {
        for (int i = 1; i < s.length(); i++)
            if (abs(int(s[i]) - int(s[i - 1])) != 1)
                return false;
        return true;
    }
    int calc(string &s)
    {
        int n = s.size(), dist[n][10];
        memset(dist, -1, sizeof dist);
        function f = [&](int i, int pre, bool is_limit, bool is_num)-> int{
            if(i == n) return is_num;
            if(!is_limit && is_num && dist[i][pre] != -1) return dist[i][pre];
            int res = 0;
            if(!is_num) res = f(i + 1, pre, false, false);
            int up = is_limit ? s[i] - '0' : 9;
            for(int j = 1 - is_num; j <= up; j ++ )
                if(!is_num || abs(j - pre) == 1)
                    res = (res + f(i + 1, j, is_limit && j == up, true)) % mod;
            if(!is_limit && is_num) dist[i][pre] = res;
            return res;
        };
        return f(0, 0, true, false);
    }
public:
    int countSteppingNumbers(string low, string high) {
        return (calc(high) - calc(low) + valid(low) + mod) % mod;
    }
};

你可能感兴趣的:(补题,leetcode,算法,c++,数据结构)