[2026-08-05] LeetCode 3371 + 3310

1 阅读1分钟

两天的每日一题,LeetCode3371是简单题,和今天的3310一起记录。

3731. 找出缺失的元素

思路

数据范围很小,直接暴力求即可。记录最小最大值,然后标记每个出现过的值,遍历一遍找到最小到最大之间的,未标记的数并收集。

代码

class Solution {
public:
    vector<int> findMissingElements(vector<int>& nums) {
        int a[200];
        memset(a, 0, sizeof a);
        int Mi = nums[0], Mx = nums[0];
        for(int x : nums)
        {
            Mi = min(Mi, x);
            Mx = max(Mx, x);
            a[x] = 1;
        }
        vector<int> ans;
        for(int i = Mi; i <= Mx; i ++)
        {
            if(a[i] == 0)
                ans.push_back(i);
        }
        return ans;
    }
};

3310. 移除可疑的方法

思路

先找到全部的可以方法,从k点作为起点进行bfs遍历,标记所有的可疑。

标记完之后,如果可以移除,那么标记的部分和未标记的部分之间不会存在边,因此可以遍历一遍边,如果找到两个端点标记不一致的,那么不能移除,否则可以移除,剩下的就是未被标记过的。

代码

class Solution {
public:
    vector<int> remainingMethods(int n, int k, vector<vector<int>>& invocations) {
        vector<int> ans;
        vector<vector<int>> to(n);
        for (auto edge : invocations) {
            int u = edge[0];
            int v = edge[1];
            to[u].push_back(v);
        }
        vector<int> bad(n, 0);
        queue<int> q;
        q.push(k);
        bad[k] = 1;
        while (!q.empty()) {
            int x = q.front();
            q.pop();
            for (int y : to[x]) {
                if (bad[y] == 0) {
                    bad[y] = 1;
                    q.push(y);
                }
            }
        }
        for (auto edge : invocations) {
            int u = edge[0];
            int v = edge[1];
            if (bad[u] != bad[v]) {
                bad.assign(n, 0);
                break;
            }
        }
        for (int i = 0; i < n; i++) {
            if (bad[i] == 0) {
                ans.push_back(i);
            }
        }
        return ans;
    }
};