第 356 场周赛 - 力扣(LeetCode)
第 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