class Solution {
public List<Integer> findAllPeople(int n, int[][] meetings, int firstPerson) {
//将二维数组传入比较器中对会议时间点排序
Arrays.sort(meetings, new Comparator<int[]>() {
@Override
public int compare(int[] rows1, int[] rows2) {
return rows1[2] - rows2[2];
}
});
int rows = meetings.length;
List<Integer> result = new ArrayList<>();
Set<Integer> set = new HashSet<>();
set.add(firstPerson);
set.add(0);
//对同一时间的会议数量计数
int count = 0;
//正着遍历一次,将知道秘密的专家加到HashSet中
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < 2; ++j) {
if (set.contains(meetings[i][j])) {
set.add(meetings[i][0]);
set.add(meetings[i][1]);
}
}
++count;
if (i > 0 && meetings[i][2] != meetings[i - 1][2]) {
count = 1;
}
//反着再来一次,因为会议可以同时瞬时发生,所以必须反着再来一次
if (i > 0 && i < rows - 1 && meetings[i][2] != meetings[i + 1][2] ||i > 0 && i == rows - 1 && meetings[i][2] == meetings[i - 1][2]) {
for (int k = i; k > i - count; --k ) {
for (int j = 0; j < 2; ++j) {
if (set.contains(meetings[k][j])) {
set.add(meetings[k][0]);
set.add(meetings[k][1]);
}
}
}
count = 0;
}
}
for (int i = 0; i < n; ++i) {
if (set.contains(i)) {
result.add(i);
}
}
return result;
}
}
5941. 找出知晓秘密的所有专家(力扣周赛2021.11.28——Java解法,哈希表)
最新推荐文章于 2024-07-19 15:45:46 发布