Java 组合2个区间
给定两个具有int start、int end和boolean状态的间隔,组合这两个间隔,如下所示Java 组合2个区间,java,algorithm,data-structures,intervals,priority-queue,Java,Algorithm,Data Structures,Intervals,Priority Queue,给定两个具有int start、int end和boolean状态的间隔,组合这两个间隔,如下所示 i1和i2是2ArrayList,res应该包含组合间隔的输出 例如: -INF --------- 6 ------- 10 --------- 30 --------- INF F T T F -INF --- 5 ------------------- 20 --------- 35 ---- INF
i1和i2是2
ArrayList
,res应该包含组合间隔的输出
例如:
-INF --------- 6 ------- 10 --------- 30 --------- INF
F T T F
-INF --- 5 ------------------- 20 --------- 35 ---- INF
T T F F
输出:
-INF ---5 ---- 6 -------- 10 -- 20 ---- 30 -- 35 --- INF
F F T T F F F
代码创建了i1和i2,它们是
ArrayList
i1有[-INF,6,false],[6,10,true],[10,30,true],[30,INF,false],
i2有[-INF,5,true],[5,20,true],[20,35,false],[35,INF,false],
res应该包含[-INF,5,false],[5,6,false],[6,10,true],[10,20,true],[20,30,false],[30,false],[35,INF,false],
代码:
类间隔
{
int启动;
内端;
布尔状态;
公共间隔(整数开始、整数结束、布尔状态)
{
this.start=start;
this.end=end;
这个状态=状态;
}
}
麦可德类{
公共静态void main(字符串[]args){
ArrayList i1=新的ArrayList();
i1.添加(新间隔(Integer.MIN_值,6,false));
i1.添加(新间隔(6,10,真));
i1.添加(新间隔(10,30,真));
i1.添加(新间隔(30,整数.MAX_值,false));
ArrayList i2=新的ArrayList();
i2.添加(新间隔(Integer.MIN_值,5,true));
i2.添加(新间隔(5,20,真));
i2.添加(新区间(20,35,假));
i2.添加(新间隔(35,整数.MAX_值,false));
int i=0,j=0;
ArrayList res=新的ArrayList();
}
}
< /代码> 区间覆盖所有轴,因此我们只考虑左端和T/F字段。
端点已排序,因此应用合并过程(如合并排序中的过程)
ia=0
ib=0
//启动第一个输出间隔代码
而ia
那么,你的问题是什么?我如何找到两个间隔之间的交点并更改I和j值并将其添加到res?res应该具有组合的间隔i1和i2以及交叉点状态的&。代码现在做什么,您希望它做什么?代码创建的i1和i2是ArrayList。i1有[[-INF,6,false],[6,10,true],[10,30,true],[30,INF,false]],i2有[-INF,5,true],[5,20,true],[20,35,false],[35,INF,false]]和res应该包含[-INF,5,false],[5,6,false],[10,20,true],[20,30,false],[30,35,INF,false],[35,INF,false]]不清楚为什么预期结果以-5,false][,5,false]开头
。在这里提供伪代码并让询问者进行具体编码是个好主意。谢谢。我认为这不起作用,因为您正在考虑A[ia].Position
或B[ib].Position
。在少数情况下,我们还要求两者相交。该算法可以保证的具体部分是什么@MBo@user11223每个新间隔从某个A[ia]位置开始,或从某个B[ib]位置开始,或从共享点开始(此处使用B[ib]。位置)。&
为当前间隔提供布尔交集。感谢您的解释。在我运行一个示例时,为了澄清一下,当您说if A[ia].Position时,当所有间隔都连接在一起时(没有空范围),就不需要终点,所以我假设只使用起点。
Class Interval
{
int start;
int end;
boolean status;
public Interval(int start, int end, boolean status)
{
this.start = start;
this.end = end;
this.status = status;
}
}
class MyCode {
public static void main (String[] args) {
ArrayList<Interval> i1 = new ArrayList<Interval>();
i1.add(new Interval(Integer.MIN_VALUE, 6, false));
i1.add(new Interval(6,10,true));
i1.add(new Interval(10,30,true));
i1.add(new Interval(30,Integer.MAX_VALUE,false));
ArrayList<Interval> i2 = new ArrayList<Interval>();
i2.add(new Interval(Integer.MIN_VALUE, 5, true));
i2.add(new Interval(5,20,true));
i2.add(new Interval(20,35,false));
i2.add(new Interval(35,Integer.MAX_VALUE,false));
int i=0, j=0;
ArrayList<Interval> res = new ArrayList<Interval>();
}
}
ia = 0
ib = 0
//Start the first output interval code
while ia < ACount and B < BCount
if A[ia].Position <= B[ib].Position
ia++
AActive = True
else if A[ia].Value >= B[ib].Value //reuse == case for simplicity
// and incrementing both indexes
ib++
AActive = False
State = A[ia].BooleanField && B[ib].BooleanField
Pos = A[ia].Position if AActive else B[ib].Position
CloseOutputInterval(Pos)
StartOutputInterval(Pos, State)
continue with the rest (A or B left)