题目
-
- 摧毁小行星
-
- 参加会议的最多员工数
思路与算法
- 第3题简单模拟即可,注意使用long long格式进行保存累加结果。有二元组的简单比较处理方式,但是暴力的复杂度也只有nlogN,不计较。
- 第4题主要问题在于找到数组中的环,并且计算环的长度。很好理解,一桌必须有两个人互相喜欢,然后旁边跟着喜欢这两个人的一个爱慕链。即A和B互相喜欢,然后有D喜欢C,C喜欢B。然后F喜欢E,E喜欢A。这样类似的链,这些人才能坐一起。否则就如第一个示例所示,必须形成喜欢的环路才可以做一桌。注意代码细节即可。
代码实现
-
- 摧毁小行星
class Solution {
public:
bool asteroidsDestroyed(int mass, vector<int>& asteroids) {
long long aCW= 0;
int len = asteroids.size();
sort(asteroids.begin(),asteroids.end());
if (mass < asteroids[0]) {
return false;
}
aCW = mass;
for (int i = 0; i < len; ++i) {
if (aCW >= asteroids[i]) {
aCW += asteroids[i];
} else {
return false;
}
}
return true;
}
};
-
- 参加会议的最多员工数
class Solution {
public:
int f(int i,vector<vector<int>>& g, unordered_set<int>& v, vector<bool>& checked, vector<int>& loop, vector<int>& straight) {
if(v.count(i)) {
for(int x : v) {
loop[x] = v.size();
}
return 0;
}
if(checked[i]) {
return straight[i];
}
v.insert(i);
int tmp = 0;
for(int j : g[i]) {
if(loop[j] == 0) {
int t = f(j,g,v,checked,loop,straight);
if(loop[j] == 0) {
tmp = max(tmp, t + 1);
}
}
}
checked[i] = true;
straight[i] = tmp;
v.erase(i);
return tmp;
}
int maximumInvitations(vector<int>& fs) {
vector<vector<int>> g(fs.size());
for(int i = 0;i<fs.size();i++) {
g[fs[i]].push_back(i);
}
vector<bool> checked(fs.size());
vector<int> loop(fs.size());
vector<int> straight(fs.size());
for(int i = 0;i<fs.size();i++) {
if(!checked[i]) {
unordered_set<int> v;
f(i,g,v,checked,loop,straight);
}
}
int total = 0;
int max_loop = 0;
for(int i = 0;i<fs.size();i++) {
if(loop[i] == 2) {
if(fs[i] > i) {
total += 2;
total += straight[i];
total += straight[fs[i]];
}
}
max_loop = max(max_loop,loop[i]);
}
return max(total,max_loop);
}
};
写在最后
- 保持专注!