第 356 场周赛 - 力扣(LeetCode)

发布时间 2023-08-01 10:53:08作者: Ke_scholar

第 356 场周赛 - 力扣(LeetCode)

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

一次遍历

class Solution {
public:
    int numberOfEmployeesWhoMetTarget(vector<int>& hours, int target) {
        
        int ans = 0;
        for(auto i : hours)
            ans += (i >= target);
        return ans;
    }
};

2799. 统计完全子数组的数目 - 力扣(LeetCode)(滑动窗口)

先求出数组中不同元素的个数,然后去遍历,用一个哈希表记录遍历过的元素,如果找到一个区间\([l,r]\)满足条件,就让\(ans\)加上\(nums.size() - r\),因为对于这样的一个区间,如果\([l,r]\)是满足条件的,那么\(r+1,r+2 \dots n\)也一定是满足条件的,因为不同元素的个数已经满足,往后也不会再有新的元素,然后就是去每次更新窗口的前端,将那些前面有重复的去掉

class Solution {
public:
    int countCompleteSubarrays(vector<int>& nums) {

    int num = unordered_set<int>(nums.begin(), nums.end()).size();
    unordered_map<int,int> mp;
    int l = 0, ans = 0;

    for(int r = 0;r < nums.size(); r++){
        mp[nums[r]]++;

        while(mp.size() == num){
            ans += nums.size() - r;
            mp[nums[l]]--;
            if(mp[nums[l]] == 0)
                mp.erase(nums[l]);
            l++;
        }
    }

    return ans;
    }
};

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

因为只有三个字符串,所以我们可以直接对三个字符串进行全排列枚举,也因为全排列枚举了所有情况,所以我们去合并的时候直接就看串\(a\)的后面能不能接\(b\)就行了

class Solution {
public:

    string merge(string a,string b){
        if(a.find(b) != -1) return a;
        if(b.find(a) != -1) return b;

        for(int i = min(a.size(),b.size());i > 0;i--)
            if(a.substr(a.size() - i) == b.substr(0,i))
                return a + b.substr(i);

        return a + b;
    }

    string minimumString(string a, string b, string c) {

        vector<string> str{a,b,c};
        sort(str.begin(),str.end());
        string ans = a + b + c;

        do{
            string Ke = merge(merge(str[0],str[1]),str[2]);
            if(Ke.size() < ans.size() || Ke.size() == ans.size() && Ke < ans)
                ans = Ke;
        }while(next_permutation(str.begin(), str.end()));

        return ans ;
    }
};

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

后面学了再来补题qwq