返回顶部

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;
    }
};
posted @ 2022-01-02 12:34  cherish-lgb  阅读(14)  评论(0编辑  收藏  举报