假设我们给出了一个员工时间表。这代表每个员工的工作时间。现在,假设每个员工都有一个不重叠的时间间隔列表,这些时间间隔将被排序。我们必须找到一个有限间隔的列表,该列表代表所有员工的共同的,正长度的空闲时间,并且这也将按照排序的顺序进行。我们以[x,y]的形式表示间隔,例如,时间表[0] [0] .start = 1,时间表[0] [0] .end = 2。
因此,如果输入类似于schedule = [[[[1,2],[5,6]],[[1,3]],[[4,10]]],则输出之一将是[[ 3,4]]。
为了解决这个问题,我们将遵循以下步骤-
定义一个2D数组v
对于初始化i:= 0,当i <计划大小时,更新(将i增加1),执行
在v的末尾插入schedule [i,j]
对于初始化j:= 0,当j <schedule [i]的大小时,更新(将j增加1),执行
对数组v排序
定义一个2D阵列ret
定义一个数组temp:= v [0]
对于初始化i:= 0,当i <v的大小时,更新(将i增加1),执行-
temp:=(如果temp [1] <v [i,1],则v [i],否则temp)
在ret的末尾插入{temp [1],v [i,0]}
temp:= v [i]
如果temp [0] <v [i,1],则-
除此以外
返回ret
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<vector<auto> > v){
cout << "[";
for(int i = 0; i<v.size(); i++){
cout << "[";
for(int j = 0; j <v[i].size(); j++){
cout << v[i][j] << ", ";
}
cout << "],";
}
cout << "]"<<endl;
}
class Solution {
public:
static bool cmp(vector<int> a, vector<int> b){
return a[0] < b[0];
}
vector<vector<int>> employeeFreeTime(vector<vector<vector<int>>> schedule) {
vector<vector<int>> v;
for (int i = 0; i < schedule.size(); i++) {
for (int j = 0; j < schedule[i].size(); j++) {
v.push_back(schedule[i][j]);
}
}
sort(v.begin(), v.end(), cmp);
vector<vector<int>> ret;
vector<int> temp = v[0];
for (int i = 0; i < v.size(); i++) {
if (temp[0] < v[i][1]) {
ret.push_back({temp[1], v[i][0]});
temp = v[i];
} else {
temp = temp[1] < v[i][1] ? v[i] : temp;
}
}
return ret;
}
};
main(){
Solution ob;
vector<vector<vector<int>>> v = {{{1,2},{5,6}},{{1,3}},{{4,10}}};
print_vector(ob.employeeFreeTime(v));
}{{{1,2},{5,6}},{{1,3}},{{4,10}}}输出结果
[[2, 1, ],[2, 1, ],[3, 4, ],[10, 5, ],]