在C ++中删除间隔
假设我们有一个不相交间隔的排序列表,每个间隔interval[i]=[a,b]代表一组数字x,使得a<=x<b。我们必须删除区间中的任何区间与toBeRemoved区间之间的交点。最后,我们必须在所有此类删除之后找到间隔的排序列表。因此,如果输入类似于−[[0,2],[3,4],[5,7]]和toBeRemoved:=[1,6],那么输出将为[[0,2],[6,7]]。
为了解决这个问题,我们将遵循以下步骤-
定义一个称为handler2()的方法,它将采用矩阵a和数组y
x:=矩阵a的最后一行,然后从a删除最后一行
z:=x
x[0]:=y[1],z[1]:=y[0]
如果z[0]-z[1],则将z插入
如果x[0]-x[1],则将x插入
主要方法将采用矩阵in和数组t
定义一个矩阵ans,并且n:=矩阵中的行数
因为我的范围是0到n–
将[i]插入ans
a:=a的最后一行,b:=t
如果a[0]>b[0],则交换a和b
如果a和b相交,则调用操纵2(ans,t)
返回ans
例子(C++)
让我们看下面的实现以更好地理解-
#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: bool isIntersect(vector <int> a, vector <int> b){ return max(a[0], a[1]) >= min(b[0], b[1]); } void manipulate2(vector < vector <int> > &a, vector <int> y){ vector <int> x = a.back(); a.pop_back(); vector <int> z = x; x[0] = y[1]; z[1] = y[0]; if(z[0] < z[1])a.push_back(z); if(x[0] < x[1])a.push_back(x); } vector<vector<int>> removeInterval(vector<vector<int>>& in, vector<int>& t) { vector < vector <int> > ans; int n = in.size(); for(int i = 0; i < n; i++){ ans.push_back(in[i]); vector <int> a; vector <int> b; a = ans.back(); b = t; if(a[0]>b[0])swap(a, b); if(isIntersect(a, b)){ manipulate2(ans, t); } } return ans; } }; main(){ vector<int> v2 = {1,6}; vector<vector<int>> v1 = {{0,2},{3,4},{5,7}}; Solution ob; print_vector(ob.removeInterval(v1, v2)); }
输入值
[[0,2],[3,4],[5,7]] [1,6]
输出结果
[[0, 1, ],[6, 7, ],]