LeetCode第274场周赛
T15967. 检查是否所有 A 都在 B 之前
题目描述:给定只含有a , b的字符串\(s\),判断是否所有的\(a\)都在\(b\)的前面
思路:根据题意模拟即可
时间复杂度:\(O(n)\)
参考代码:
class Solution {
public:
bool checkString(string s) {
int n = s.size();
s = 'a' + s;
for(int i = 1 ; i <= n ; ++i)
if(s[i] == 'a' && s[i - 1] == 'b') return false;
return true;
}
};
T25968. 银行中的激光束数量
题目描述:给你一个二维矩阵,每行可能含有发射器,每个发射器可以与相邻行的所有发射器连线,问最多能连多少条线。这里的相邻的含义可以看下图的示例:
思路:根据题意模拟即可
时间复杂度:\(O(n^2)\)
参考代码:
class Solution {
public:
int numberOfBeams(vector<string>& bank) {
int res = 0;
int n = bank.size() , m = bank[0].size();
for(int i = 0 ; i < n ; ++i){
int cnt = 0;
for(auto c : bank[i]) cnt += c =='1';
if(!cnt) continue;
for(int j = i + 1 ; j < n ; ++j){
int ct = 0;
for(auto c : bank[j]) ct += c == '1';
if(!ct) continue;
res += ct * cnt;
i = j - 1;
break;
}
}
return res;
}
};
T35969. 摧毁小行星
题目描述:给你一个数组\(nums\)和一个初始值\(mass\),重排这个数组后的所有前缀和加上初始值是否不小于下一个数。假设重排后的数组为\(arr\),则更形式化的描述为:
\[mass +\sum\limits_{i = 0}^{j} arr_i \geq arr_{j + 1}\; \forall \;0 \leq j \leq n - 2
\]
思路:非常简单的题目,排序之后,判断前缀和即可,注意这题前缀和会超过int32的表示范围,所以注意开long long或者做其它操作。
时间复杂度:\(O(nlogn + n) = O(nlogn)\)
参考代码:
class Solution {
public:
bool asteroidsDestroyed(int mass, vector<int>& nums) {
sort(nums.begin() , nums.end());
for(auto num : nums){
if(num > mass) return false;
mass += num;
mass = min(mass , 10000005);
}
return true;
}
};
T45970. 参加会议的最多员工数
题目描述:有一张圆桌和\(n\)个人,每个人都有想要相邻的人,问你最多能满足多少人的要求。
思路:首先这个约束关系是一个有向图,那么可以猜测需要先求有向图的最大环,考虑使用拓扑排序将非环部分给标记掉,然后用dfs去求环的大小再取最值,但这样还不够,对于二元环会有以下几种情况,所以需要在拓扑排序的时候记录每个点的最大深度,并将每个环的下标进行存储,在最后的时候特殊处理一下二元环。
时间复杂度:\(O(n)\)
参考代码:
class Solution {
public:
int maximumInvitations(vector<int>& fa) {
int n = fa.size();
vector<int>income(n , 0);
vector<vector<int>>g(n , vector<int>(2 , 0));
for(int i = 0 ; i < n ; ++i){
income[fa[i]]++;
}
vector<bool> vis(n , false);
vector<int> dep(n , 0);
queue<int>q;
for(int i = 0 ; i < n ; ++i){
if(income[i] != 0) continue;
g[i][1] = 1;
q.push(i);
}
while(!q.empty()){
int u = q.front();
q.pop();
vis[u] = true;
income[fa[u]]--;
dep[fa[u]] = max(dep[fa[u]] , dep[u] + 1);
if(income[fa[u]] == 0) q.push(fa[u]);
}
int res = 0;
vector<vector<int>>graph(n);
auto dfs = [&](auto f , int u , int cnt , int fl)->void{
if(!vis[u]){
vis[u] = true;
graph[fl].push_back(u);
f(f , fa[u] , cnt + 1 , fl);
}
res = max(res , cnt);
return ;
};
int idx = 0;
for(int i = 0 ; i < n ; ++i)
if(!vis[i]){
dfs(dfs , i , 0 , idx++);
}
int ct = 0;
for(int i = 0 ; graph[i].size() > 0 ; ++i){
if(graph[i].size() > 2) continue;
int u = graph[i][0] , v = graph[i][1];
ct += 2 + dep[u] + dep[v];
}
res = max(res , ct);
return res;
}
};
作者:cherish.
出处:https://home.cnblogs.com/u/cherish-/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。