两天的每日一题,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;
}
};