一个源区间和n个无序的目标区间,判断源区间是否在目标区间内。
方法一:
直接的思路,将源区间和无序目标区间投影到坐标轴上,如果所有源区间都被覆盖,则源区间在目标区间内。
import java.util.ArrayList;
import java.util.Scanner;
class qujian
{
int s;
int e;
}
public class qujianpanduan
{
//解法一
public static boolean source(Scanner sc)
{
qujian sou=new qujian();
if(sc.hasNext())
{
sou.s=sc.nextInt();
sou.e=sc.nextInt();
}
ArrayList<qujian> list=new ArrayList<qujian>();
list.add(sou);
qujian des=new qujian();
while(sc.hasNext())
{
ArrayList<qujian> list1=new ArrayList<qujian>();
des.s=sc.nextInt();
des.e=sc.nextInt();
qujian tmp;
int len=list.size();
for(int i=0;i<len;i++)
{
qujian t1=new qujian();
qujian t2=new qujian();
tmp=list.get(i);
if(tmp.e>des.e&&des.s>tmp.s)
{
t1.s=tmp.s;
t1.e=des.s;
t2.s=des.e;
t2.e=tmp.e;
list1.add(t1);
list1.add(t2);
}else if(tmp.e<des.e&&des.s>tmp.s&&tmp.e>des.s)
{
t1.s=tmp.s;
t1.e=des.s;
list1.add(t1);
}else if(des.e<tmp.e&&tmp.s>des.s&&des.e>tmp.s)
{
t1.s=des.s;
t1.e=tmp.s;
list1.add(t1);
}else if(tmp.s>des.e||tmp.e<des.s)
{
list1.add(tmp);
}
}
list=list1;
}
if(list.isEmpty()) return true;
return false;
}
public static void main(String[] args)
{
//在控制台输入以下内容进行测试:1 6 2 3 1 2 3 9
//[1,6]为源区间,[2,3][1,2][3,9]为目标区间
Scanner sc=new Scanner(System.in);
System.out.println(source(sc));
sc.close();
}
}
解法二
将目标区间合并成几个有序的区间,这样就可以进行区间的比较。
代码如下:
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Scanner;
class qujian
{
int s;
int e;
}
class comp implements Comparator<qujian>
{
@Override
public int compare(qujian o1, qujian o2) {
// TODO Auto-generated method stub
if(o1.s>o2.s) return 1;
else return -1;
}
}
public class qujianpanduan
{
public static ArrayList<qujian> hebiang(Scanner sc)
{
ArrayList<qujian> list=new ArrayList<qujian>();
while(sc.hasNext())
{
qujian des=new qujian();
des.s=sc.nextInt();
des.e=sc.nextInt();
list.add(des);
}
list.sort(new comp());
ArrayList<qujian> list1=new ArrayList<qujian>();
int len=list.size();
for(int i=0;i<len-1;i++)
{
qujian tmp1=list.get(i);
qujian tmp2=list.get(i+1);
if(tmp1.e<tmp2.s) list1.add(tmp1);
else
{
tmp2.s=tmp1.s;
list.set(i+1, tmp2);
}
}
list1.add(list.get(len-1));
return list1;
}
public static boolean isIn(qujian sou,Scanner sc)
{
//用二分查找法降低时间复杂度
ArrayList<qujian> list=hebiang(sc);
int len=list.size();
int s=0;
int e=len-1;
while(s<=e)
{
int mid=(s+e)/2;
qujian tmp=list.get(mid);
if(tmp.s<=sou.s&&tmp.e>=sou.e) return true;
if(tmp.s>sou.s) e=mid-1;
else if(tmp.e<sou.e) s=mid+1;
}
return false;
}
public static void main(String[] args)
{
//在控制台输入以下内容进行测试:2 3 1 2 3 9
//[2,3][1,2][3,9]为目标区间
Scanner sc=new Scanner(System.in);
//源区间为[1,6]
qujian s=new qujian();
s.s=1;
s.e=6;
System.out.println(isIn(s,sc));
sc.close();
}
}