假设我们有两个人的可用时隙列表slot1和slot2,并且会议持续时间为d,我们必须找到适用于他们两个人的最早时隙,其持续时间为d。如果没有满足要求的通用时隙,则显示一个空数组。此处的时隙格式是由两个元素组成的数组[start,end],表示从开始到结束的整个时间范围。我们可以假设,同一个人的两个可用性空缺彼此不相交。也就是说,对于同一个人的任何两个时隙[s1,e1]和[s2,e2],s1> e2或s2> e。因此,如果输入类似于s1 = [[10,50],[60,120],[140,210]]和s2 = [[0,15],[60,70]]且持续时间= 8,则输出将为[ 60,68]。
为了解决这个问题,我们将遵循以下步骤-
i:= 0和j:= 0,建立一个数组ans,对s1和s2进行排序。
而i <s1的大小和j <s2的大小
将start和(start + duration)插入ans数组,然后返回ans。
end:= s1 [i,1]和s2 [j,1]的最小值
开始:= s1 [i,0]和s2 [j,0]的最小值
如果结束–开始> =持续时间,则
否则,当s1 [i,1] <s2 [j,1]时,将i增加1
否则将j增加1
返回ans
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h> using namespace std; void print_vector(vector<auto> v){ cout << "["; for(int i = 0; i<v.size(); i++){ cout << v[i] << ", "; } cout << "]"<<endl; } using namespace std; bool cmp(vector <int> a, vector <int> b){ return a[0]<b[0]; } class Solution { public: vector<int> minAvailableDuration(vector<vector<int>>& slots1, vector<vector<int>>& slots2, int duration) { int i =0; int j = 0; vector <int> ans; sort(slots1.begin(),slots1.end(),cmp); sort(slots2.begin(),slots2.end(),cmp); while(i<slots1.size() && j<slots2.size()){ int end = min(slots1[i][1],slots2[j][1]); int start = max(slots1[i][0],slots2[j][0]); if(end-start>=duration){ ans.push_back(start); ans.push_back(start+duration); return ans; } else if(slots1[i][1]<slots2[j][1]) { i++; } else { j++;} } return ans; } }; main(){ vector<vector<int>> v = {{10,50},{60,120},{140,210}}; vector<vector<int>> v1 = {{0,15},{60,70}}; Solution ob; print_vector(ob.minAvailableDuration(v, v1, 8)); }
[[10,50],[60,120],[140,210]] [[0,15],[60,70]] 8
输出结果
[60, 68, ]